gpt4 book ai didi

python - 通过从列表复制到 numpy 数组来加速 cython 循环

转载 作者:太空宇宙 更新时间:2023-11-03 11:06:31 25 4
gpt4 key购买 nike

我正在编写一些性能密集型代码,并希望从 cythonistas 那里得到一些关于如何进一步改进它的反馈。我编写的函数的用途有点难以解释,但它们的作用并不那么令人生畏。第一个(大致)采用两个数字列表字典并将它们连接起来以获得一个数字列表字典。它只运行一次,所以我不太关心优化它。第二个首先调用第一个,然后使用其结果基本上将存储在 numpy 数组中的索引与数组列表中的数字交叉,以在 (pybloomfiltermmap) 布隆过滤器上形成查询(新数字)。

我确定沉重的一步是由于我的嵌套循环并减少了使用的循环数量,将所有只需要发生一次的事情移出循环,并尽我所知输入所有内容。不过,第二个函数中 i 的每次迭代都需要大约 10 秒,这太多了。我仍然在 html 编译输出中看到黄色的主要内容是由于列表和 numpy 数组中的索引访问,所以我尝试用所有 numpy 数组替换我的列表,但没有得到任何改进。如果您能提供任何反馈,我将不胜感激。

#cython: boundscheck=False
#cython: wraparound=False

import numpy as np
cimport numpy as np

def merge_dicts_of_lists(dict c1, dict c2):
cdef dict res
cdef int n, length1, length2, length3
cdef unsigned int i, j, j_line, jj, k, kk, new_line

res = {n: [] for n in range(256)}
length1 = len(c1)

for i in range(length1):
length2 = len(c1[i])
for j in range(length2):
j_line = c1[i][j]
jj = (j_line) % 256
length3 = len(c2[jj])
for k in range(length3):
kk = c2[jj][k]
new_line = (j_line << 10) + kk
res[i].append(new_line)
return res


def get_4kmer_set(np.ndarray c1, dict c2, dict c3, bf):
cdef unsigned int num = 0
cdef unsigned long long query = 0
cdef unsigned int i, j, i_row, i_col, j_line
cdef unsigned int length1, length2
cdef dict merge
cdef list m_i

merge = merge_dicts_of_lists(c2, c3)
length1 = len(c1[:,0])
for i in range(length1):
print "i is %d" % i
i_row = c1[i,0]
i_col = c1[i,1]
m_i = merge[i_col]
length2 = len(m_i)
for j in range(length2):
j_line = m_i[j]
query = (i_row << 24) + (i_col << 20) + j_line
if query in bf:
num += 1
print "%d yes answers from bf" % num

最佳答案

为了后代,我添加了一个题外话的答案,但我希望它对某些人有用。我在上面发布的代码与我决定保留的代码没有太大区别,因为它已经编译为 Ctyhon html 编译输出所见的短 C 行。

由于最内层的操作是布隆过滤器查询,我发现最有帮助的是通过两种方式加快该步骤。一个是将 pybloomfiltermmap 使用的哈希函数更改为 murmurhash3 的可用 C++ 实现。我发现 pybloomfilter 使用的是 sha,这对于加密哈希函数来说相对较慢。第二个提升来自应用本文中发现的技巧:http://www.eecs.harvard.edu/~kirsch/pubs/bbbf/rsa.pdf .基本上,它表示您可以通过使用两个哈希值的线性组合而不是 BF 的 k 个不同哈希值来节省大量计算。这两个技巧共同使查询时间缩短了一个数量级 (~5x)。

关于python - 通过从列表复制到 numpy 数组来加速 cython 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17908763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com