python - 使用 python 从文件中加速 3d 数组填充
问题描述
我正在使用 python 填充一个 3d 数组,每个数组元素代表一个像素。
我需要插入数组的值存储在一个非常大的 .txt 文件中(5600 万行,格式如下 - x、y、z、r、g、b)
现在我:
用零初始化 3d 数组。
逐行读取文件。
对于仅采用前 3 个元素 (x,y,z) 的每一行。
从 x 和 y 计算数组 location[i,j]
如果 array[i,j] 等于 0 --> 插入从文件中读取的行
否则跳到下一个文件
对于 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
解决方案
也许 readlines() 在这种情况下会有所帮助,此示例一次读取所有行并将整个文件加载到内存中:
with open('foo') as f:
lines = f.readlines()
for line in lines:
pass
但是您正在处理大型文本文件,因此您可以限制每个循环中的缓冲区使用
with open('foo') as f:
while True:
lines = f.readlines(8192)
if not lines:
break
for line in lines:
pass
file.readlines([sizehint]) sizehint 是根据文档的字节数
推荐阅读
- c# - Blazor,将 0 值绑定属性填充为输入中的空字符串
- kotlin - 如何使用 mockito_kotlin 存根具有通用 KClass 参数的 Kotlin 方法?
- java - 跟踪企业中使用自定义 java 功能的用户数量
- javascript - 如何使浏览器后退按钮跳过内页导航并返回上一页
- .net - Zxing.Net 的条码阅读器
- ffmpeg - 如何在 H.264 中更改宏块的大小?
- javascript - 单独的数组并将其分配给角度中的不同参数
- json - Chart.js 散点图 - 字符串输入转换不起作用
- javascript - WebdriverIO - 如何随机点击页面
- excel - 使用过滤器获取 Excel 工作表的单元格计数 - 错误当第一个字符是等号或减号时,Excel 认为这是一个公式