【发布时间】:2018-01-24 10:56:48
【问题描述】:
我有一个 3x256 规则的规则集。每个规则都映射到一个 3x3 的值网格,而这些值本身就是规则。
示例规则:
0 -> [[0,0,0],[0,1,0],[0,0,0]]
1 -> [[1,1,1],[0,0,0],[1,1,1]]
种子:
[[0]]
1 次迭代后:
[[0,0,0],
[0,1,0],
[0,0,0]]
2 次迭代后:
[[0,0,0,0,0,0,0,0,0],
[0,1,0,0,1,0,0,1,0],
[0,0,0,0,0,0,0,0,0],
[0,0,0,1,1,1,0,0,0],
[0,1,0,0,0,0,0,1,0],
[0,0,0,1,1,1,0,0,0],
[0,0,0,0,0,0,0,0,0],
[0,1,0,0,1,0,0,1,0],
[0,0,0,0,0,0,0,0,0]]
现在我有了一个有效的实现,但是,它是我脚本中最慢的函数。我想知道是否有更pythonic和更有效的方法来重写这个函数。
def decode(rules,fractal_iterations,seed):
final_seed_matrix = np.zeros((3,3**fractal_iterations,3**fractal_iterations))
for i in range(dimensions):
seed_matrix = np.array([[seed]])
for j in range(fractal_iterations):
size_y = seed_matrix.shape[0]
size_x = seed_matrix.shape[1]
new_matrix = np.zeros((size_y*rule_size_sqrt,size_x*rule_size_sqrt))
for y in range(size_y):
for x in range(size_x):
seed_value = seed_matrix[y,x]
new_matrix[y*rule_size_sqrt : y*rule_size_sqrt+rule_size_sqrt, x*rule_size_sqrt : x*rule_size_sqrt+rule_size_sqrt] = rules[int(seed_value),i]
seed_matrix = new_matrix
final_seed_matrix[i] = seed_matrix
return np.moveaxis(final_seed_matrix,0,-1)
【问题讨论】:
-
如果您不坚持使用纯 Python 而是使用近乎 Pythonic 的代码,也许可以使用 Cython。我不保证你可以使用 Cython 获得比其他 Python 算法更快的代码。我不是 Cython 的专家。 cython.readthedocs.io/en/latest/src/tutorial/numpy.html
-
一般规则是在追加速度很快的地方使用 python 数组。然后在收集完所有内容后,创建一次数组。
-
预分配数组很好。嵌套的
for循环是性能杀手,但我不确定是否可以在这里进行大量矢量化。dimensions变量和相关外循环的目的是什么? -
@kazemakase 维度变量用于 3 个颜色维度。它是全局定义的,但在第 4 行应该是 3。
-
这是否意味着您独立地迭代每个维度?如果移动到最内层循环,这可能可能被矢量化。