【发布时间】:2021-03-06 19:19:49
【问题描述】:
这个问题是one of my previous questions 的扩展,内容是在 Python 中优化数组计算。我给定问题的答案是通过@tomjn as 给出的
tot_list = np.where((X == 1) | (Y == 1) | (Z == 1),np.random.random(),1).sum(axis=1)
现在,我想用 Julia 写这个。上面很容易翻译成
tot_list = ifelse.((X.==1).|(Y.==1).|(Z.==1),rand(Float64),1)
请注意,X、Y 和 Z 是逻辑矩阵。当我在 Julia 中运行我的代码时,上述工作正常。但是,它非常缓慢。我正在尝试对上述内容进行去矢量化,我得到了
tot_list = similar(X)
for j in 1:length(tot_list)
tot_list[j] = ifelse((X[j]==1)|(Y[j]==1)|(Z[j]==1),rand(Float64),1)
end
但是,生成的代码实际上不会产生与矢量化、低效版本相同的结果。我无法举一个例子,因为差异仅在非常大的输入时才明显,但我很肯定上面编写的 Julia 代码的两个部分之间存在很大差异。我究竟做错了什么?两个tot_list不应该一样吗?
编辑:差异可能是由于我在执行此计算之后尝试进行的计算。在我运行上面的代码之前,我定义了
variable_tot = zeros(Float64,1,8*N_state)
运行上面给出的 tot_list 计算后,我再运行
variable_tot=variable_tot+reshape(tot_list,:,length(tot_list))
这和我的问题有关吗?
【问题讨论】:
-
X、Y和Z是非const全局变量吗?如果是这样,只需将您的代码包装在一个函数中就会有很大帮助。 -
@OscarSmith 它们不是全局变量。我定义了一个函数,并在该函数中专门将它们定义为更大矩阵的子集。具体来说,我称一个大的 nxm 逻辑矩阵,提取某些列并称它们为 R1 和 R2,设置 X=R1、Y=R1|R2 和 Z=R1&R2。
标签: python arrays logic julia vectorization