自Python3.2以来,GIL实现是否变得更糟糕?
我读过关于GIL的精彩介绍: 这里Dave说,自从Python3.2以来,我们有了新的更好的GIL版本,并提供了一些例子来证明这一点(见幻灯片54) 但当我自己在Python 3.4上测试它们时,性能似乎更差:自Python3.2以来,GIL实现是否变得更糟糕?,python,performance,gil,Python,Performance,Gil,我读过关于GIL的精彩介绍: 这里Dave说,自从Python3.2以来,我们有了新的更好的GIL版本,并提供了一些例子来证明这一点(见幻灯片54) 但当我自己在Python 3.4上测试它们时,性能似乎更差: from threading import Thread def count(n): while n > 0: n -= 1 def sequential_test(): count(100000000) count(100000000) def thr
from threading import Thread
def count(n):
while n > 0:
n -= 1
def sequential_test():
count(100000000)
count(100000000)
def threaded_test():
t1 = Thread(target=count,args=(100000000,))
t1.start()
t2 = Thread(target=count,args=(100000000,))
t2.start()
t1.join()
t2.join()
所以在我的Linux双核笔记本电脑上
在Python 2.7中,我得到:
sequential_test: 11s
threaded_test: 17s
在Python 3.4中,我得到:
sequential_test: 18s
threaded_test: 28s
所以问题是为什么在Python3.4中,在这两种情况下,代码的运行速度都较慢,为什么我看不到GIL在两个CPU受限的进程上与Python2相比有任何改进
我可能做错什么了吗
我的猜测是,在Python2中,这种代码有一些C代码优化,这就是为什么它工作得更快,但我没有它的经验。我测试了这个循环:
for (i=0; i<loops; i++)
{
Py_BEGIN_ALLOW_THREADS
Py_END_ALLOW_THREADS
}
对于(i=0;i我测试了这个循环:
for (i=0; i<loops; i++)
{
Py_BEGIN_ALLOW_THREADS
Py_END_ALLOW_THREADS
}
for(i=0;i的迭代次数是我看到的2.7:14/22(+57%)、3.5:22/27(+23%)的两倍。Python3整体速度似乎较慢,即使是在顺序上,但GIL似乎至少在3.5中比您的数字显示的要好。使用ThreadPoolExecutor(max\u workers=2)也会很有趣python2的速度是否会通过使用10000000L
作为参数而改变?请记住,在python3中,所有整数都是长整数,它们必然较慢(这可能是顺序测试中的显著差异的原因)。还要注意的是,虽然python3的线程版本仍然较慢,但时间的相对增长比python2的要小,尽管不是很大的因素。@JoachimIsaksson,我安装了python3.5,并得到了这样的结果:17/28(+64%)
,如果使用两倍以上的数据,这个比例几乎保持不变34/55(+62%)
@Bakuriu,你说得对!当我在python2中设置100000000 l
时,我得到这样的结果:34/47(+38%)
,因此python3的执行速度更快。@Bakuriu,@JoachimIsaksson正如我在每次实验中看到的,python3中线程版本的相对增长更高。在多线程情况下,Python2.7和python3.4似乎都经历了几乎完全相同的乘法因子减速。我看不出GIL的变化有任何原因。两次正如我看到的2.7:14/22(+57%)、3.5:22/27(+23%)的迭代次数一样多。Python3整体速度似乎较慢,即使是按顺序进行,但GIL确实在3.5中的表现似乎比您的数字显示的要好。使用ThreadPoolExecutor(max_workers=2)也会很有趣python2的速度是否会通过使用10000000L
作为参数而改变?请记住,在python3中,所有整数都是长整数,它们必然较慢(这可能是顺序测试中的显著差异的原因)。还要注意的是,虽然python3的线程版本仍然较慢,但时间的相对增长比python2的要小,尽管不是很大的因素。@JoachimIsaksson,我安装了python3.5,并得到了这样的结果:17/28(+64%)
,如果使用两倍以上的数据,这个比例几乎保持不变34/55(+62%)
@Bakuriu,你说得对!当我在python2中设置100000000 l
时,我得到这样的结果:34/47(+38%)
,因此python3执行得更快。@Bakuriu,@JoachimIsaksson正如我在每次实验中所看到的,python3中线程版本的相对增长更高。在多线程情况下,Python2.7和python3.4似乎都经历了几乎完全相同的乘法因子减速。我看不出有什么要归咎于GIL的变化。嗨,user11585016,要获得帮助或您的问题得到回答,您需要以清晰简洁的方式提问。您没有这样做。嗨,用户11585016,要获得帮助或您的问题得到回答,您需要以清晰简洁的方式提问。您没有这样做。