【发布时间】:2020-02-23 15:27:44
【问题描述】:
我正在优化一段代码,发现列表复制(浅)是瓶颈。
现在我很好奇:为什么复制列表比复制 8 字节的 array 慢得多?在我看来应该没有区别。在这两种情况下,它都应该只是memcpy(dst, src, sizeof(int64_t)*len(src)),因为指针的长度是 8 个字节。但显然 Python 所做的工作比我预期的要多。它与GC有某种关系吗?或者列表是否有可能实现为链表?
import array
import numpy as np
import timeit
n = 100*1000
lst = [i for i in range(n)]
arr = array.array('q', lst)
nmp = np.array(arr, dtype=np.int64)
assert(arr.itemsize == 8)
n_iter = 100000
print('=== copy() ===')
print('List of int:', timeit.timeit(stmt='lst.copy()', setup='from __main__ import lst', number=n_iter))
print('Array of 8-bytes:', timeit.timeit(stmt='arr.__copy__()', setup='from __main__ import arr', number=n_iter))
print('Numpy array of int64:', timeit.timeit(stmt='nmp.copy()', setup='from __main__ import nmp', number=n_iter))
结果:
=== copy() ===
List of int: 27.434935861998383
Array of 8-bytes: 2.6839109230022586
Numpy array of int64: 2.69919407800262
【问题讨论】:
标签: python arrays performance numpy copy