为什么以下简单的并行化代码比Python中的简单循环慢得多?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么以下简单的并行化代码比Python中的简单循环慢得多?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1761字,纯文字阅读大概需要3分钟。
内容图文
![为什么以下简单的并行化代码比Python中的简单循环慢得多?](/upload/InfoBanner/zyjiaocheng/811/bca4ce4fc5994f5f88fbad51212a1487.jpg)
一个计算数字平方并存储结果的简单程序:
import time
from joblib import Parallel, delayed
import multiprocessing
array1 = [ 0 for i in range(100000) ]
def myfun(i):
return i**2
#### Simple loop ####
start_time = time.time()
for i in range(100000):
array1[i]=i**2
print( "Time for simple loop --- %s seconds ---" % ( time.time()
- start_time
)
)
#### Parallelized loop ####
start_time = time.time()
results = Parallel( n_jobs = -1,
verbose = 0,
backend = "threading"
)(
map( delayed( myfun ),
range( 100000 )
)
)
print( "Time for parallelized method --- %s seconds ---" % ( time.time()
- start_time
)
)
#### Output ####
# >>> ( executing file "Test_vr20.py" )
# Time for simple loop --- 0.015599966049194336 seconds ---
# Time for parallelized method --- 7.763299942016602 seconds ---
这两个选项的阵列处理有何不同?我的实际程序会有一些更复杂的东西,但这是我需要尽可能简单地并行化的计算,但不是这样的结果.
System Model: HP ProBook 640 G2, Windows 7,
IDLE for Python System Type: x64-based PC Processor:
Intel(R) Core(TM) i5-6300U CPU @ 2.40GHz,
2401 MHz,
2 Core(s),
4 Logical Processor(s)
解决方法:
从线程的documentation:
If you know that the function you are calling is based on a compiled
extension that releases the Python Global Interpreter Lock (GIL)
during most of its computation …
问题是在这种情况下,你不知道. Python本身只允许一个线程同时运行(python解释器每次执行python操作时都会锁定GIL).
如果myfun()将大部分时间花在编译的Python扩展中,并且该扩展释放GIL,则线程只会有用.
并行代码是如此令人尴尬地缓慢,因为你正在做大量的工作来创建多个线程 – 然后你无论如何只能一次执行一个线程.
如果使用多处理后端,则必须将输入数据复制到四个或八个进程(每个核心一个)中的每个进程中,在每个进程中执行处理,然后将输出数据复制回来.复制速度会很慢,但如果处理比计算正方形稍微复杂一些,那么它可能是值得的.测量并看到.
内容总结
以上是互联网集市为您收集整理的为什么以下简单的并行化代码比Python中的简单循环慢得多?全部内容,希望文章能够帮你解决为什么以下简单的并行化代码比Python中的简单循环慢得多?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。