为什么 UDP 套接字在 Python 中需要这么长时间?
Why does UDP socket takes such long time in Python?
当我在 python 中测试套接字时,我想知道为什么完成 UDP 发送和接收过程需要这么长时间。
(使用我的代码,每次联系 LOCALLY 大约需要 2 毫秒,使用它在进程或线程之间进行通信太慢了)
我是不是做错了什么?(运行 在单线程中还是什么?)还是因为 python 就是那么慢?
服务器演示代码如下:
import socket,time
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind('localhost',6000)
while True:
data, addr = s.recvfrom(1024)
s.sendto(b'',addr)
客户是这样的:
import socket,time
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)\
for i in range(100):
t = time.time()
s.sendto('localhost',6000)
s.recv(1024)
print(time.time() - t)
输出是这样的:
0.00799250602722168
0.0020029544830322266
0.0010268688201904297
0.0010089874267578125
0.0010042190551757812
0.0020051002502441406
0.002005338668823242
0.002005338668823242
0.002005338668823242
0.002005338668823242
0.002005338668823242
0.002005338668823242
0.0020051002502441406
0.0020058155059814453
0.0027120113372802734
0.0010039806365966797
0.0020055770874023438
0.00200653076171875
0.002003908157348633
0.0010035037994384766
0.0020051002502441406
0.0020074844360351562
0.0010325908660888672
0.002005338668823242
0.002690553665161133
0.0010037422180175781
0.0020055770874023438
0.0020051002502441406
0.002005338668823242
0.002005338668823242
0.001806020736694336
0.0010192394256591797
0.0010271072387695312
0.0020055770874023438
0.002007007598876953
0.0020041465759277344
0.002004861831665039
0.001999378204345703
0.0020067691802978516
0.0019817352294921875
0.002007007598876953
谁能解决我的问题?
非常感谢
我比那个快两个数量级(~0.01ms,3.4GHz i7-6700)也许 localhost
解决了一些奇怪的问题,它需要重试吗?
你的代码也不适合我,我贴出我用过的代码。服务器端优先:
import socket
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.bind(('localhost',6000))
while True:
data, addr = s.recvfrom(1024)
s.sendto(b'',addr)
现在客户端:
import socket
from time import time
addr = socket.getaddrinfo(
'localhost', 6000,
socket.AF_INET, socket.SOCK_DGRAM)[0]
with socket.socket(*addr[:3]) as s:
s.connect(addr[4])
for i in range(1000):
t1 = time()
s.send(b'')
t2 = time()
s.recv(1024)
t3 = time()
if i % 100 == 0:
print('{:.3f}ms {:.3f}ms'.format((t2 - t1) * 1000, (t3 - t2) * 1000))
请注意,我使用 socket.connect()
来尝试减少解决时间,但这对我来说似乎没有任何区别。我得到:
0.218ms 0.006ms
0.004ms 0.010ms
0.004ms 0.007ms
0.004ms 0.008ms
0.004ms 0.011ms
0.004ms 0.010ms
0.004ms 0.010ms
0.004ms 0.009ms
0.004ms 0.010ms
0.004ms 0.008ms
后退,即第一次慢,然后快
如果您不太关心可移植性,unix 域套接字可能会更快,否则您可以尝试 zeromq which has nice Python packages
当我在 python 中测试套接字时,我想知道为什么完成 UDP 发送和接收过程需要这么长时间。
(使用我的代码,每次联系 LOCALLY 大约需要 2 毫秒,使用它在进程或线程之间进行通信太慢了)
我是不是做错了什么?(运行 在单线程中还是什么?)还是因为 python 就是那么慢?
服务器演示代码如下:
import socket,time
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind('localhost',6000)
while True:
data, addr = s.recvfrom(1024)
s.sendto(b'',addr)
客户是这样的:
import socket,time
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)\
for i in range(100):
t = time.time()
s.sendto('localhost',6000)
s.recv(1024)
print(time.time() - t)
输出是这样的:
0.00799250602722168
0.0020029544830322266
0.0010268688201904297
0.0010089874267578125
0.0010042190551757812
0.0020051002502441406
0.002005338668823242
0.002005338668823242
0.002005338668823242
0.002005338668823242
0.002005338668823242
0.002005338668823242
0.0020051002502441406
0.0020058155059814453
0.0027120113372802734
0.0010039806365966797
0.0020055770874023438
0.00200653076171875
0.002003908157348633
0.0010035037994384766
0.0020051002502441406
0.0020074844360351562
0.0010325908660888672
0.002005338668823242
0.002690553665161133
0.0010037422180175781
0.0020055770874023438
0.0020051002502441406
0.002005338668823242
0.002005338668823242
0.001806020736694336
0.0010192394256591797
0.0010271072387695312
0.0020055770874023438
0.002007007598876953
0.0020041465759277344
0.002004861831665039
0.001999378204345703
0.0020067691802978516
0.0019817352294921875
0.002007007598876953
谁能解决我的问题? 非常感谢
我比那个快两个数量级(~0.01ms,3.4GHz i7-6700)也许 localhost
解决了一些奇怪的问题,它需要重试吗?
你的代码也不适合我,我贴出我用过的代码。服务器端优先:
import socket
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.bind(('localhost',6000))
while True:
data, addr = s.recvfrom(1024)
s.sendto(b'',addr)
现在客户端:
import socket
from time import time
addr = socket.getaddrinfo(
'localhost', 6000,
socket.AF_INET, socket.SOCK_DGRAM)[0]
with socket.socket(*addr[:3]) as s:
s.connect(addr[4])
for i in range(1000):
t1 = time()
s.send(b'')
t2 = time()
s.recv(1024)
t3 = time()
if i % 100 == 0:
print('{:.3f}ms {:.3f}ms'.format((t2 - t1) * 1000, (t3 - t2) * 1000))
请注意,我使用 socket.connect()
来尝试减少解决时间,但这对我来说似乎没有任何区别。我得到:
0.218ms 0.006ms
0.004ms 0.010ms
0.004ms 0.007ms
0.004ms 0.008ms
0.004ms 0.011ms
0.004ms 0.010ms
0.004ms 0.010ms
0.004ms 0.009ms
0.004ms 0.010ms
0.004ms 0.008ms
后退,即第一次慢,然后快
如果您不太关心可移植性,unix 域套接字可能会更快,否则您可以尝试 zeromq which has nice Python packages