我正在做一个项目,当我做格式保留加密(包括三种类型的字母、字母数字和数字)时,为了实现这一点,我编写了几个方法,然后我编写了一个将文件作为输入的方法,一个分隔符,我使用字符串方法“split()”按分隔符分割文件中的文本,并对每个字符串调用加密方法,加密调用很多其他方法来实现 FPE 加密,然后我打开另一个文件以在其上写入生成的加密文本。
问题是当我测试 100 万行的文本文件时,加密花了 18 分钟 我做了一些优化工作,例如我使用理解列表而不是 for 循环,因为它们更快,我试图避免对字符串进行操作,因为它们成本很高,结果是 8 分钟,这是一个很好的改进,但还不够,好吧,我想要使用 numba ,问题是我在类内部使用方法,而 @jit 不能正常工作(我有一些它不知道它们的对象),然后我尝试了 PyPy 广告,对于同一个文件,改进令人印象深刻我有2分10秒。 但它仍然太长了,因为然后我尝试了一个有 1000 万行的文件,并且使用 pypy 需要 28 分钟才能加密。 我该怎么做才能获得更快的速度???
部分代码:
def tokenize_text(self, text, separator):
encrypted = []
for string in text.split(separator):
encrypted.append(self.encrypt(string))
return separator.join(encrypted)
def tokenize_file(self, file, separator, output_file=None):
with open(file, 'r', encoding='utf-8') as f1:
text = f1.read()
if output_file is None:
base, ext = file.rsplit('.', 1)
output_file = f"{base}_tokenized.{ext}"
with open(output_file, 'w', encoding='utf-8') as f2:
f2.write(self.tokenize_text(text, separator))
return output_file
这里
def tokenize_text(self, text, separator):
encrypted = []
for string in text.split(separator):
encrypted.append(self.encrypt(string))
return separator.join(encrypted)
你正在重复
.append
到list
,根据wiki.python.org
可能需要非常长的时间,具体取决于容器的历史记录。
你可以通过这样做来避免这种情况
return separator.join(map(self.encrypt,text.split(separator)))