<p>是的,两次评估阵列会增加计算时间。以下是我的测试用例:</p>
<pre><code>def funLoop(A):
xyz = []
for row in range(A.shape[0]):
for col in range(A.shape[1]):
xyz.append([col, row, A[row, col] ])
def funListComp1(A):
xyz = [ [col, row, A[row, col] ]
for row in range(A.shape[0]) for col in range(A.shape[1])]
def funListComp2(A):
xyz = [ [col, A[row, col], A[row, col] ]
for row in range(A.shape[0]) for col in range(A.shape[1])]
A = np.random.rand(1000,1000)
%timeit funLoop(A)
%timeit funListComp1(A)
%timeit funListComp2(A)
</code></pre>
<pre><code>457 ms ± 70.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
378 ms ± 8.89 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
779 ms ± 309 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
</code></pre>
<p>对于大数据,对于循环,您应该始终更喜欢使用numpy而不是python。在您的情况下,numpy代码看起来有点像:</p>
<pre><code>def asc_process_single_numpy(asc_array):
nodata_value = np.nan
raster_size_y = 1
skip = 2
xllcornor = 0
yllcornor = 0
cellsize = 1
rows = np.arange(0,asc_array.shape[0],skip)[:,np.newaxis]
cols = np.arange(0,asc_array.shape[1],skip)
#for row in rows for col in cols
x = np.zeros((len(rows),len(cols))) + xllcornor + (cols * cellsize)
y = np.zeros((len(rows),len(cols))) + yllcornor + raster_size_y - (rows * cellsize)
z = asc_array[::skip,::skip]
return np.asarray([x,y,z]).T.transpose((1,0,2)).reshape( (int(len(rows)*len(cols)), 3) )
A = np.random.rand(1000,1000)
%timeit asc_process_single(A)
%timeit asc_process_single_listcomprehension(A)
%timeit asc_process_single_numpy(A)
</code></pre>
<pre><code>183 ms ± 13 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
210 ms ± 2.05 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
11.3 ms ± 222 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
</code></pre>