我正在使用python填充3d数组,每个数组元素代表一个像素。
我需要插入到数组中的值存储在一个很大的.txt文件中 (5600万行,格式如下-x,y,z,r,g,b)
现在我:
使用零初始化3d数组。
逐行读取文件。
每行仅包含前三个元素(x,y,z)。
根据x和y计算数组位置[i,j]
如果array [i,j]等于零->插入从文件读取的行
否则将跳至下一个文件
5600万行需要我大约160秒的时间
如何使用python加快速度? (可以使用gpu)
array = np.zeros((height, width), dtype=np.float32)
with open(point_cloud_file) as pc_file:
while True:
line = pc_file.readline()
if not line:
break
nof_read_lines += 1
new_line = line.strip()
try:
x, y, z, _, _, _ = new_line.split(',')
except:
nof_skipped_lines += 1
continue
# insert to array
pixel_x = some calculation
pixel_y = some calculation
if 0 < pixel_x < width and 0 < pixel_y < height:
if array[int(pixel_y), int(pixel_x), 0] == 0:
array[int(pixel_y), int(pixel_x), :] = x, y, z
else:
nof_skipped_lines += 1 # pixel already filled with values
答案 0 :(得分:1)
在这种情况下,readlines()可能会有所帮助 此示例一次读取所有行,然后将整个文件加载到内存中:
a = df['X']
b = df['Y']
a1 = a.values
a2 = a.shift(-1).ffill().values
b1 = b.values[:, None]
arr = (((a1 < b1) & (a2 > b1)) | ((a1 > b1) & (a2 < b1)))
df = pd.DataFrame(arr)
df[np.nan] = True
out = df.idxmax(axis=1) + 1
out = out.mask(out.duplicated())
print (out)
0 2.0
1 NaN
2 3.0
3 NaN
4 NaN
5 6.0
6 NaN
dtype: float64
但是您正在处理大型文本文件,因此可以限制每个循环中的缓冲区使用量
with open('foo') as f:
lines = f.readlines()
for line in lines:
pass
file.readlines([sizehint]) sizehint是根据文档计数的字节数