<p>我正在发布我的足够快的解决方案。如果你仍然看到改进的可能性,我很乐意测试一下。(我希望一些库已经有了一个更快的解决方案;也许有,但我的问题/解决方法不够清晰,无法使用)</p>
<p>以下是数据生成代码:</p>
<pre><code>import numpy as np
from datetime import datetime
np.random.seed(1)
Irange = range(50)
Jrange = range(10)
Krange = range(80)
Lrange = range(8)
Mrange = range(18)
A = [
(i,j,k,l,m)
for i in Irange
for j in Jrange
for k in Krange
for l in Lrange
for m in Mrange]
B = [
(l,m,k)
for k in Krange
for l in Lrange
for m in Mrange]
C = {key: np.random.uniform(1,10) for key in A}
D = {key: np.random.uniform(0,1) for key in B}
</code></pre>
<p>首先,启动计时器并引入一个列表<code>unique_ijk</code>:</p>
<pre><code>start_timer = datetime.now() #Start counting time
unique_ijk = list(set([(i,j,k) for i,j,k,l,m in A]))
</code></pre>
<p>然后,创建一个名为<code>lm_given_ijk</code>的字典,该字典使用与给定的i,j,k元组键对应的l,m索引列表进行赋值</p>
<pre><code>lm_given_ijk = {(i,j,k):[] for i,j,k in unique_ijk}
for i,j,k,l,m in A:
lm_given_ijk[i,j,k].append((l,m))
</code></pre>
<p>最后,按如下方式使用<code>lm_given_ijk</code>来创建<code>E</code></p>
<pre><code>E = {(i,j,k): sum(C[i,j,k,l,m]*D[l,m,k] for l,m in lm_given_ijk[i,j,k])
for i,j,k in unique_ijk}
print("Elapsed time is %s seconds.\n"%(datetime.now()-start_timer).total_seconds())
</code></pre>
<p>输出:</p>
<pre><code>Elapsed time is 6.446798 seconds.
</code></pre>
<p>写下所有这些,我同意评论说这是一个numpy数组的事情。它可以提高速度,但我对6.4秒感到满意</p>