Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自Python3.2以来,GIL实现是否变得更糟糕?_Python_Performance_Gil - Fatal编程技术网

自Python3.2以来,GIL实现是否变得更糟糕?

自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

我读过关于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 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,要获得帮助或您的问题得到回答,您需要以清晰简洁的方式提问。您没有这样做。