Python-4.33 IO模型

  • 阻塞IO

blocking IO的特点就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了

# 服务端

from socket import *
from threading import Thread


def communicate(conn):
    while True:
        try:
            data = conn.recv(1024)
            if not data: break
            conn.send(data.upper())
        except ConnectionResetError:
            break
    conn.close()


server = socket(AF_INET, SOCK_STREAM)
server.bind(('127.0.0.1', 8080))
server.listen(5)

while True:
    print('start...')
    conn, addr = server.accept()
    print(addr)

    t = Thread(target=communicate, args=(conn,))
    t.start()

server.close()
# 客户端

from socket import *

client = socket(AF_INET, SOCK_STREAM)
client.connect(('127.0.0.1', 8080))

while True:
    msg = input('>>: ').strip()
    if not msg: continue
    client.send(msg.encode('utf-8'))
    data = client.recv(1024)
    print(data.decode('utf-8'))

client.close()
  • 非阻塞IO

在非阻塞式IO中,用户进程其实是需要不断的主动询问kernel数据准备好了没有。

# 服务端

from socket import *

server = socket(AF_INET, SOCK_STREAM)
server.bind(('127.0.0.1', 8080))
server.listen(5)
server.setblocking(False)
print('start......')

rlist = []
wlist = []

while True:
    try:
        conn, addr = server.accept()
        rlist.append(conn)
        print(rlist)
    except BlockingIOError:
        # print('干其他的活')

        # 收消息
        del_rlist = []
        for conn in rlist:
            try:
                data = conn.recv(1024)
                if not data:
                    del_rlist.append(conn)
                    continue
                wlist.append((conn, data.upper()))
            except BlockingIOError:
                continue
            except Exception:
                conn.close()
                del_rlist.append(conn)
        # 发消息
        del_wlist = []
        for item in wlist:
            try:
                conn = item[0]
                data = item[1]
                conn.send(data)
                del_wlist.append(item)
            except BlockingIOError:
                pass
        for item in del_wlist:
            wlist.remove(item)
        for conn in del_rlist:
            rlist.remove(conn)

server.close()
  • 多路复用IO
    select的优势在于可以处理多个连接,不适用于单个连接
# 服务端

import select
from socket import *

server = socket(AF_INET, SOCK_STREAM)
server.bind(('127.0.0.1', 8080))
server.listen(5)
server.setblocking(False)
print('start......')

rlist = [server, ]
wlist = []
wdata = {}

while True:
    r1, w1, x1 = select.select(rlist, wlist, [], 0.5)
    print('r1', r1)
    print('w1', w1)

    for sock in r1:
        if sock == server:
            conn, addr = sock.accept()
            rlist.append(conn)

        else:
            try:
                data = sock.recv(1024)
                if not data:
                    sock.close()
                    rlist.remove(sock)
                    continue
                wlist.append(sock)
                wdata[sock] = data.upper()

            except Exception:
                sock.close()
                rlist.remove(sock)
    for sock in w1:
        data = wdata[sock]
        sock.send(data)
        wlist.remove(sock)
        wdata.pop(sock)

server.close()

Python中有多种用于进行相关性分析的模型。其中最常用的是皮尔森相关系数和斯皮尔曼秩相关系数。 皮尔森相关系数可以衡量两个连续变量之间的线性相关性。在Python中,你可以使用scipy库中的pearsonr函数来计算皮尔森相关系数。例如,如果你有两个变量x和y,你可以使用以下代码来计算相关系数和p值: ```python import scipy.stats as stats x = [10.35, 6.24, 3.18, 8.46, 3.21, 7.65, 4.32, 8.66, 9.12, 10.31] y = [5.1, 3.15, 1.67, 4.33, 1.76, 4.11, 2.11, 4.88, 4.99, 5.12] correlation, pvalue = stats.pearsonr(x, y) print ('correlation:', correlation) print ('p-value:', pvalue) ``` 另一个常用的相关性分析模型是斯皮尔曼秩相关系数,它可以用于衡量两个变量之间的单调关系,不要求变量呈线性关系。在Python中,你可以使用scipy库的spearmanr函数来计算斯皮尔曼秩相关系数。以下是一个示例代码: ```python from scipy.stats import spearmanr x = [10.35, 6.24, 3.18, 8.46, 3.21, 7.65, 4.32, 8.66, 9.12, 10.31] y = [5.1, 3.15, 1.67, 4.33, 1.76, 4.11, 2.11, 4.88, 4.99, 5.12] correlation, pvalue = spearmanr(x, y) print ('correlation:', correlation) print ('p-value:', pvalue) ``` 除了这两种方法外,还有其他一些方法可以用于相关性分析,如Kendall秩相关系数等。你可以使用pandas库中的corr函数来计算这些系数。具体实现可以参考相关文档或者网上的教程。 总之,Python提供了多种方法进行相关性分析,你可以根据你的数据和研究问题选择适合的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值