首先,我无法重现与您在我的Linux机器上看到的几乎一样大的性能差异。我一直看到线程版本大约20-25秒,而asyncio版本大约24-34秒。

现在,为什么asyncio要慢?这其中有一些原因。首先,asyncio版本必须按顺序打印,但线程版本不按顺序打印。打印是I/O,因此GIL可以在发生时释放。这意味着可能有两个或多个线程可以同时打印,尽管在实践中这种情况可能不会经常发生,而且可能不会对性能产生太大的影响。

其次,更重要的是,getaddrinfo的asyncio版本实际上是just calling ^{} in a ^{}:def getaddrinfo(self, host, port, *,

family=0, type=0, proto=0, flags=0):

if self._debug:

return self.run_in_executor(None, self._getaddrinfo_debug,

host, port, family, type, proto, flags)

else:

return self.run_in_executor(None, socket.getaddrinfo,

host, port, family, type, proto, flags)

它使用默认的ThreadPoolExecutor作为这个,which only has five threads:# Argument for default thread pool executor creation.

_MAX_WORKERS = 5

对于这个用例,这几乎不是您想要的那么多并行性。要使其行为更像threading版本,您需要对1000个线程使用ThreadPoolExecutor,方法是通过loop.set_default_executor将其设置为默认执行器:loop = asyncio.get_event_loop()

loop.set_default_executor(ThreadPoolExecutor(1000))

coroutines = asyncio.wait([getaddr(loop, i+site) for i in create_host(char)])

loop.run_until_complete(coroutines)

现在,这将使行为更等价于threading,但这里的实际情况是您实际上没有使用异步I/O—您只是将threading与不同的API结合使用。因此,您在这里所能做的最好的事情就是与threading示例的性能相同。

最后,您并没有在每个示例中真正运行等效代码,threading版本使用一个工作池,它共享一个queue.Queue,而asyncio版本则为url列表中的每个项生成一个协程。如果我将asyncio版本设置为使用asyncio.Queue和协程池,除了删除print语句和设置更大的默认执行器之外,这两个版本的性能基本相同。这是新的asyncio代码:import asyncio

import string

import time

from concurrent.futures import ThreadPoolExecutor

start = time.time()

def create_host(char):

for i in char:

yield i

for i in create_host(char):

if len(i)>1:

return False

for c in char:

yield c + i

char = string.digits + string.ascii_lowercase

site = '.google.com'

@asyncio.coroutine

def getaddr(loop, q):

while True:

url = yield from q.get()

if not url:

break

try:

res = yield from loop.getaddrinfo(url,80)

except:

pass

@asyncio.coroutine

def load_q(loop, q):

for host in create_host(char):

yield from q.put(host+site)

for _ in range(NUM):

yield from q.put(None)

NUM = 1000

q = asyncio.Queue()

loop = asyncio.get_event_loop()

loop.set_default_executor(ThreadPoolExecutor(NUM))

coros = [asyncio.async(getaddr(loop, q)) for i in range(NUM)]

loop.run_until_complete(load_q(loop, q))

loop.run_until_complete(asyncio.wait(coros))

end = time.time()

print(end-start)

以及每种产品的产量:dan@dandesk:~$ python3 threaded_example.py

20.409344911575317

dan@dandesk:~$ python3 asyncio_example.py

20.39924192428589

不过,请注意,由于网络的原因,有些变化。他们两个有时都会比这慢几秒。

python gpu加速库比matlab快吗_为什么异步库比此I/O绑定操作的线程慢?相关推荐

  1. python gpu加速库比matlab快吗_python – 为什么asyncio库比这个I / O绑定操作的线程慢?...

    首先,我无法重现与我在Linux机器上看到的性能差异几乎一样大的性能差异.对于线程版本,我一直看到大约20-25秒,对于asyncio版本在24-34秒之间. 现在为什么asyncio慢了?有一些事情 ...

  2. python gpu加速库比matlab快吗_Python之Unittest和Requests库详解

    1.按类来执行 import unittest class f1(unittest.TestCase): def setUp(self): pass def tearDown(self): pass ...

  3. Python GPU加速

    Numba:高性能计算的高生产率 在这篇文章中,笔者将向你介绍一个来自Anaconda的Python编译器Numba,它可以在CUDA-capable GPU或多核cpu上编译Python代码.Pyt ...

  4. python gpu加速 显卡_PyTorch-GPU加速实例

    硬件:NVIDIA-GTX1080 软件:Windows7.python3.6.5.pytorch-gpu-0.4.1 一.基础知识 将数据和网络都推到GPU,接上.cuda() 二.代码展示 imp ...

  5. opencv python gpu加速_在Windows上使用OpenCV和Python进行硬件加速解码(MSMT/IntelMFX/FFMPEG/any-backend)...

    我无法在Windows10上使用OpenCV进行硬件加速解码. 有什么提示吗?我已经在最新的opencv4.1.0forwindows中编译并尝试了所有的后端. 我对MSMF解码最有信心,因为它支持D ...

  6. python gpu加速 显卡_使用Python玩转GPU

    问题 随着机器学习对模型运算速度的需求越来越强烈, 一直想进行GPU编程,但一直以来这些都是c++的专利 一想到c++里的各种坑,就提不起劲来,毕竟这样来来回回填坑的投入产出,生产效率就会大打折扣 解 ...

  7. python gpu加速 显卡_AMD的GPU现在可以加速TensorFlow深度学习了

    近日,AMD 宣布推出适用于 ROCm GPU 的 TensorFlow v1.8 接口,其中包括 Radeon Instinct MI25.AMD 称,这是该公司在实现深度学习加速上的重要里程碑.R ...

  8. opencv python gpu加速_OpenCV中配置CUDA,实现GPU加速

    1. 查看本机配置,查看显卡类型是否支持NVIDIA GPU,本机显卡为NVIDIA GeForce  GT630: 3. 从https://developer.nvidia.com/cuda-too ...

  9. python绘制红色五角星、边长100像素_使用turtle库绘制一个五角星

    如何采用Python语言绘制一个五角星 #./usr/bin/env python import turtle import time turtle.forward(100) turtle.right ...

最新文章

  1. 大公司为什么还在采用过时的技术
  2. python中webdriver_浅谈python中selenium库调动webdriver驱动浏览器的实现原理
  3. 计算机科学速成视频35,计算机科学速成课30:万维网【视频】
  4. 兰华峰:商业模式驱动企业参与MSU评测
  5. 【.NET Core 3.0】 46 ║ 授权认证:自定义返回格式
  6. java final 修改_“无法改变的设计”——浅谈Java中的final关键字
  7. [机器学习笔记]Note10--支持向量机(SVM)
  8. 阿里巴巴大数据实践—实时技术
  9. Linux调试时常见问题,C程序在linux下调试时经常出现的问题
  10. Java 反射机制之 Class
  11. 百度下拉词推广是什么?
  12. IT也要健康:帮助你保持健康的几个重要因素
  13. python pcl_windows 10 环境pcl-python 安装
  14. 机器学习中的算法——决策树模型组合之随机森林与GBDT
  15. Java的三种技术架构是什么?
  16. IDEA格式化js代码
  17. 2010 年全国大学生数学建模竞赛甘肃赛区 获奖情况
  18. CIO40知识星球—5年工程师升职IT主管(22-27岁)
  19. 漫步数理统计二十三——泊松分布
  20. Unity3D接入Android第三方SDK流程

热门文章

  1. mysql数据类型符号位_MySQL数据类型
  2. c++排查线程hang住_Kafka学习笔记之kafka高版本Client连接0.9Server引发的血案排查 - 时光飞逝,逝者如斯...
  3. 设置串行端口的通信参数
  4. 防Xss攻击,包含富文本编辑器的处理
  5. Ajax——从服务器获取各种文件
  6. 再读UNPv1:复习、实践、小结
  7. (转)C#开发微信门户及应用(4)--关注用户列表及详细信息管理
  8. swift-初探webView与JS交互
  9. Jrebel6.3.3破解,配置图文教程
  10. JAVA escape/unescape