gpt4 book ai didi

python - 返回语句时速度慢

转载 作者:行者123 更新时间:2023-11-28 19:25:18 24 4
gpt4 key购买 nike

我有这个 cython 代码只是为了测试:

cimport cython

cpdef loop(int k):
return real_loop(k)

@cython.cdivision
cdef real_loop(int k):
cdef int i
cdef float a
for i in xrange(k):
a = i
a = a**2 / (a + 1)
return a

我用这样的脚本测试了这个 cython 代码和纯 python 中的相同代码之间的速度差异:

import mymodule

print(mymodule.loop(100000))

我的速度提高了 80 倍。但是如果我删除 cython 代码中的两个 return 语句,我会快 800-900 倍。为什么 ?

另一件事是,如果我在我的旧 ACER Aspire ONE 笔记本电脑上运行此代码(返回),我的速度会提高 700 倍,而在家里的新台式 i7 PC 上,速度会提高 80 倍。

有人知道为什么吗?

最佳答案

我用下面的代码测试了你的问题:

#cython: wraparound=False
#cython: boundscheck=False
#cython: cdivision=True
#cython: nonecheck=False
#cython: profile=False

def loop(int k):
return real_loop(k)

def loop2(int k):
cdef float a
real_loop2(k, &a)
return a

def loop3(int k):
real_loop3(k)
return None

def loop4(int k):
return real_loop4(k)

def loop5(int k):
cdef float a
real_loop5(k, &a)
return a

cdef float real_loop(int k):
cdef int i
cdef float a
a = 0.
for i in range(k):
a += a**2 / (a + 1)
return a

cdef void real_loop2(int k, float *a):
cdef int i
a[0] = 0.
for i in range(k):
a[0] += a[0]**2 / (a[0] + 1)

cdef void real_loop3(int k):
cdef int i
cdef float a
a = 0.
for i in range(k):
a += a**2 / (a + 1)

cdef float real_loop4(int k):
cdef int i
cdef float a
a = 0.
for i in range(k):
a += a*a / (a + 1)
return a

cdef void real_loop5(int k, float *a):
cdef int i
a[0] = 0.
for i in range(k):
a[0] += a[0]*a[0] / (a[0] + 1)

其中 real_loop() 接近您的函数,对 a 进行了修改,因为原始公式看起来很奇怪。

函数 real_loop2() 不返回任何值,只是通过引用更新 a

函数 real_loop3() 没有返回任何值。

检查为 real_loop3() 生成的 C 代码,可以看到循环就在那里,并且调用了代码...但我的结论与@dmytro,更改 k 不会显着改变时间...所以这里一定有一点我遗漏了。

从下面的时间我们可以说 return 不是瓶颈,因为 real_loop2()real_loop5() 没有返回任何值,它们的性能分别与 real_loop()real_loop4() 相同。

In [2]: timeit _stack.loop(100000)
1000 loops, best of 3: 1.71 ms per loop

In [3]: timeit _stack.loop2(100000)
1000 loops, best of 3: 1.69 ms per loop

In [4]: timeit _stack.loop3(100000)
10000000 loops, best of 3: 78.5 ns per loop

In [5]: timeit _stack.loop4(100000)
1000 loops, best of 3: 913 µs per loop

In [6]: timeit _stack.loop5(100000)
1000 loops, best of 3: 979 µs per loop

请注意将 a**2 更改为 a*a ~2X 加速,因为 a**2 需要函数调用powf() 在循环内。

关于python - 返回语句时速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14775372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com