我必须在R*C
网格上进行大量的模拟。
这些模拟正在改变网格,所以我需要先复制我的参考网格,然后在新的网格上应用我的模拟功能。
在Python中执行此操作的最快方法是什么?
由于我没有在StackOverflow上找到类似的问题,我自己做了测试并决定在这里发布它们认为它们对其他人有用。
答案将是社区响应,以便其他人可以使用其他技术添加新的测量结果。
如果您添加其他方法,请记住测量所有旧测试并更新它们,因为时间取决于所使用的计算机,避免偏差结果。
答案 0 :(得分:4)
我使用了一个bash变量来设置timeit
测试:
setup="""
R = 100
C = 100
from copy import deepcopy
import numpy as np
ref = [[i for i in range(C)] for _ in range(R)]
ref_np = np.array(ref)
cp = [[100 for i in range(C)] for _ in range(R)]
cp_np = np.array(cp)
"""
为方便起见,我还设置了一个临时别名pybench
:
alias pybench='python3.5 -m timeit -s "$setup" $1'
Python 3.5.0+(默认,2015年10月11日,09:05:38)
<强> deepcopy的:强>
>>> pybench "cp = deepcopy(ref)"
100 loops, best of 3: 8.29 msec per loop
使用索引修改预先创建的数组:
>>> pybench \
"for y in range(R):
for x in range(C):
cp[y][x] = ref[y][x]"
1000 loops, best of 3: 1.16 msec per loop
嵌套列表理解:
>>> pybench "cp = [[x for x in row] for row in ref]"
1000 loops, best of 3: 390 usec per loop
<强>切片:强>
>>> pybench "cp = [row[:] for row in ref]"
10000 loops, best of 3: 45.8 usec per loop
NumPy copy:
>>> pybench "cp_np = np.copy(ref_np)"
100000 loops, best of 3: 6.03 usec per loop
复制到预先创建的NumPy数组:
>>> pybench "np.copyto(cp_np, ref_np)"
100000 loops, best of 3: 4.52 usec per loop
在这些结果中没有什么值得惊讶的,正如您可能已经猜到的那样,使用NumPy的速度要快得多,尤其是如果每次都避免创建新表。
答案 1 :(得分:0)
为了补充 Delgan 的答案,numpy copy 的文档说使用 numpy.ndarray.copy 作为首选方法。所以现在,不做时序测试,我将使用 numpy.ndarray.copy
https://numpy.org/doc/stable/reference/generated/numpy.copy.html
https://numpy.org/doc/stable/reference/generated/numpy.ndarray.copy.html