【发布时间】:2019-01-17 16:54:58
【问题描述】:
我正在尝试优化一些代码。我已经设法使用 Numpy 和 Numba 优化了我的大部分项目,但还有一些我无法使用这些工具优化的剩余字符串处理代码。因此,我想尝试使用 Cython 优化这部分。
此处的代码采用行程编码字符串(一个字母,可选地后跟一个数字,指示该字母重复多少次)并将其扩展。然后,它使用字典查找将扩展的字符串转换为 0 和 1 的数组,以将字母与 0 和 1 的序列匹配。
是否可以使用 Cython 来优化这段代码?
import numpy as np
import re
vector_list = ["A22gA5BA35QA17gACA3QA7gA9IAAgEIA3wA3gCAAME@EACRHAQAAQBACIRAADQAIA3wAQEE}rm@QfpT}/Mp-.n?",
"A64IA13CA5RA13wAABA5EAECA5EA4CEgEAABGCAAgAyAABolBCA3WA4GADkBOA?QQgCIECmth.n?"]
_base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@}]^+-*/?,._"
_bin2base64 = {"{:06b}".format(i): base64char for i, base64char in enumerate(_base64chars)}
_base642bin = {v: k for k, v in _bin2base64.items()}
_n_vector_ranks_only = np.arange(1023,-1,-1)
def _decompress_get(data):
for match in re.finditer(r"(?P<char>.)((?P<count>\d+))?", data):
if not match.group("count"): yield match.group("char")
else: yield match.group("char") * int(match.group("count"))
def _n_apply_weights(vector):
return np.multiply(vector, _n_vector_ranks_only)
def n_decompress(compressed_vector):
decompressed_b64 = "".join(_decompress_get(compressed_vector))
vectorized = "".join(_base642bin[c] for c in decompressed_b64)[:-2]
as_binary = np.fromiter(vectorized, int)
return as_binary
def test(x, y):
if len(x) != 1024:
x = n_decompress(x)
vector_a = _n_apply_weights(x)
if len(y) != 1024:
y = n_decompress(y)
vector_b = _n_apply_weights(y)
maxPQ = np.sum(np.maximum(vector_a, vector_b))
return np.sum(np.minimum(vector_a, vector_b))/maxPQ
v1 = vector_list[0]
v2= vector_list[1]
print(test(v1, v2))
【问题讨论】:
-
问题中应包含相关代码(非站外)。
-
代码是 862 个字符,太长了
-
我已将代码编辑到问题中。提出这个问题的主要原因是我们希望问题对未来的其他人有用,并且可以轻松删除链接
-
好的,我用代码删除我的 cmets,谢谢。
-
我已经尝试过让问题更清楚一点...检查编辑以查看您是否同意。