Python 如何有效地计算多个列表的共现计数?

Python 如何有效地计算多个列表的共现计数?,python,numpy,Python,Numpy,我使用的是Python3.8,需要高效地计算列表中数字的共现计数 我有以下数组: x = [[1, 3, 4], [5, 11, 4, 4], ...] 我想计算一个共现矩阵,如下所示: C[i][j] = # freq(i) * freq(j) summed over all lists k in x for l in x: freqs = np.bincount(l, minlength=SIZE) C[freqs > 0] += np.outer(freqs[freqs

我使用的是Python3.8,需要高效地计算列表中数字的共现计数

我有以下数组:

x = [[1, 3, 4], [5, 11, 4, 4], ...]
我想计算一个共现矩阵,如下所示:

C[i][j] = # freq(i) * freq(j) summed over all lists k in x
for l in x:
  freqs = np.bincount(l, minlength=SIZE)
  C[freqs > 0] += np.outer(freqs[freqs != 0], freqs) 
我目前已将x中每个列表的计算矢量化,如下所示:

C[i][j] = # freq(i) * freq(j) summed over all lists k in x
for l in x:
  freqs = np.bincount(l, minlength=SIZE)
  C[freqs > 0] += np.outer(freqs[freqs != 0], freqs) 
问题是我看不出有什么办法可以把这个外环矢量化。我也看不到一种通过并行来轻松加速的方法。C可以有~1B个条目,因此合并类型的并行性将对内存造成困难

有没有办法加快速度


注意:x可以有2.5M的列表,C可以有75k个边(唯一元素)

您是否有NxM数组(可以使用numpy ndarray表示),或者像您的示例所示,只是一个长度不同的列表列表?只是一个长度不同的列表列表。x可以有2M+个元素,因此NxM数组太大,因此您可能无法通过使用
numpy
轻松对其进行矢量化。如果你想坚持使用Python,你可以尝试
numba
。由于外循环的每次迭代都会带来显著的有效负载,矢量化不会为你节省太多,因为开销与工作的比率已经很小了。你是否有NxM数组(可以使用numpy ndarray表示),或者就像你的例子所建议的那样,只是一个长度不同的列表?只是一个长度不同的列表。x可以有2M+个元素,因此NxM数组太大,因此您可能无法通过使用
numpy
轻松对其进行矢量化。如果你想坚持使用Python,你可以尝试
numba
。因为外部循环的每次迭代都会带来显著的有效负载,矢量化不会为你节省太多,因为开销与工作的比率已经很小了。