python - 如何减少包含 2 个 for 循环的代码的运行时间?
问题描述
在下面的代码中,2 个 for 循环平均需要大约 0.05 秒才能完成。data
是一个 numpy 数组。每个 i, j 单元包含一个元组,其中包含由这些函数定义的 RGB 值。我稍后会使用这些 RGB 值构建图像,并且i, j
是x, y
像素坐标。
有什么办法可以减少这个操作的时间吗?或者有没有其他更快的方法可以通过将每个像素的 RGB 值指定为某种数学函数来构建图像?
start = time.time()
for i in range (0, 150):
for j in range(0, 150):
data[i,j] = [int(math.sin(math.pi*i/300.0)*127.5 + 127.5),
int(math.cos(peak)*127.5 + 127.5),
int(math.sin(math.pi*j/300.0)*127.5 + 127.5)]
print ('Time: ', time.time() - start)```
解决方案
您可以使用此处删除所有循环ogrid
,而只使用三个计算,一个 for r
、g
和b
.
x, y, z = data.shape
i, j = np.ogrid[:x, :y]
data[..., 0] = (np.sin(np.pi*i/300)*127.5 + 127.5).astype(int)
data[..., 1] = (np.cos(peak)*127.5 + 127.5).astype(int)
data[..., 2] = (np.sin(np.pi*j/300)*127.5 + 127.5).astype(int)
表现
def rgb_vectorized(x, y, peak=1):
data = np.empty((x, y, 3), dtype=int)
i, j = np.ogrid[:x, :y]
data[..., 0] = (np.sin(np.pi*i/300)*127.5 + 127.5).astype(int)
data[..., 1] = (np.cos(peak)*127.5 + 127.5).astype(int)
data[..., 2] = (np.sin(np.pi*j/300)*127.5 + 127.5).astype(int)
return data
def rgb_original(x, y, peak=1):
data = np.empty((x, y, 3), dtype=int)
for i in range (x):
for j in range(y):
data[i,j] = [int(math.sin(math.pi*i/300.0)*127.5 + 127.5),
int(math.cos(peak)*127.5 + 127.5),
int(math.sin(math.pi*j/300.0)*127.5 + 127.5)]
return data
%timeit rgb_vectorized(1000, 1000)
9.85 ms ± 109 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit rgb_original(1000, 1000)
3.4 s ± 27.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
验证
>>> np.array_equal(rgb_vectorized(1000, 1000), rgb_original(1000, 1000))
True
推荐阅读
- python - 有没有办法在 Jupyter Lab 中切换单元格输出?
- apache-curator - 在 Curator 中使用带有缓存的选择策略
- python - google AutoML Vision 是否有批量预测以及如何使用?
- ios - 使用 UIBezierPath 为带有阴影的选定边缘添加角半径 | iOS | 斯威夫特 4.2
- reactjs - CSS被覆盖?
- xml - XSLT:如何修复不复制属性值的 xsl:sort
- excel - 应用程序或对象定义的错误 1004 错误
- c++ - 如何在 CPU 上计算矢量变换?
- python - 为内部为白色,外部为黑色的多边形创建图像
- javascript - 当我运行项目时,我使用本机警告:ViewPager Android 已从 react-native 中提取?