gpt4 book ai didi

python - 为什么 Numpy.array 比获取子列表的内置列表慢

转载 作者:太空宇宙 更新时间:2023-11-04 05:52:02 25 4
gpt4 key购买 nike

我将提高我的代码片段的性能,它会经常递归地获取子数组。

所以我使用了 numpy.array 而不是内置列表。因为,据我所知,在获取子数组时, numpy.array 不会复制原始列表。

但是当我改用 numpy.array 时,性能变差了。所以我想知道原因。谢谢!

以下是我的代码片段和使用我得到的不同对象的执行时间:

import timeit
stat = '''
import numpy
def func(a):
a[len(a)-1] += 1
if len(a) == 1:
return a[0]
else:
return func(a[1:len(a)])
a1=[1,2,3,4,5,6,7,8,9,10]
a2=numpy.array([1,2,3,4,5,6,7,8,9,10])
'''
if __name__ == "__main__":
print "Execution time with build-in list: {0}".format(timeit.timeit('func(a1)', setup = stat, number = 1000))
print "Execution time with Numpy array: {0}".format(timeit.timeit('func(a2)', setup = stat, number = 1000))

在我的 64 位 mac(Python 2.7.6 + Numpy 1.8.0rc1)上,输出是:

Execution time with build-in list: 0.00507998466492
Execution time with Numpy array: 0.0195469856262

最佳答案

如果您按如下方式修改最后两行代码,您将获得相同的执行时间:

print "Execution time with build-in list: {0}".format(timeit.timeit(
'func(a1)', setup = stat, number = 1000), 'gc.enable()')
print "Execution time with Numpy array: {0}".format(timeit.timeit(
'func(a2)', setup = stat, number = 1000), 'gc.enable()')

在这两种情况下,我们都允许 timeit 打开所谓的垃圾收集,即在不再使用内存时释放内存的过程。上述修改返回,例如:

Execution time with build-in list: 0.00580596923828
Execution time with Numpy array: 0.00822710990906

具有相同的数量级。根据 timeit 的文档“默认情况下,它在计时期间暂时关闭垃圾收集。这种做法的优点是它使独立计时更具可比性。缺点是垃圾收集可能是一个被测量功能性能的重要组成部分。”

对于应该使用什么方法,即有或没有垃圾收集,以及什么时候应该使用有一个薄弱的理解。另请注意,如果您从 time 模块应用 time.time() block ,您将获得更长的时间。

关于python - 为什么 Numpy.array 比获取子列表的内置列表慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29813940/

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