我在Python3.6.8中有一个脚本,它读取一个非常大的文本文件,其中每一行都是从字母表{a,b,c,d,e,f}
中提取的一个ASCII字符串。
对于每一行,我有一个函数,它使用大小为k
的滑动窗口对字符串进行分段,然后为看到的每个分段将分段计数器字典fragment_dict
递增1。
对整个文件使用相同的fragment_dict
,并针对映射为零的所有可能的5^k
片段对其进行初始化。
我还忽略任何包含字符c
的片段。请注意,c
并不常见,大多数行根本不会包含它。
def fragment_string(mystr, fragment_dict, k):
for i in range(len(mystr) - k + 1):
fragment = mystr[i:i+k]
if 'c' in fragment:
continue
fragment_dict[fragment] += 1
因为我的文件很大,所以我想尽可能优化上面函数的性能。有没有人能提供任何潜在的优化来使这个功能更快?
我担心我可能会受到Python循环速度的限制,在这种情况下,我需要考虑使用C/Cython。
发布于 2020-03-05 22:18:12
Numpy可能有助于加速您的代码:
x = np.array([ord(c) - ord('a') for c in mystr])
filter = np.geomspace(1, 5**(k-1), k, dtype=int)
fragment_dict = collections.Counter(np.convolve(x, filter,mode='valid'))
其思想是,表示每个k长度的段是一个k位的5进制数。然后,将等于该字符串的0-5个整数的列表转换为其5元表示形式,相当于使用1,5,25,125,...as过滤器。
https://stackoverflow.com/questions/60554173
复制