gpt4 book ai didi

python - 在 python 中编写巨大的字符串

转载 作者:太空宇宙 更新时间:2023-11-04 03:37:14 26 4
gpt4 key购买 nike

我有一个很长的字符串,几乎有 1 MB 长,我需要将其写入文本文件。常规

file = open("file.txt","w")
file.write(string)
file.close()

可以,但是太慢了,有没有办法让我写得更快?

我正在尝试将数百万位数字写入文本文件该数字的顺序为 math.factorial(67867957)

这是分析中显示的内容:

    203 function calls (198 primitive calls) in 0.001 seconds

Ordered by: standard name

ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 re.py:217(compile)
1 0.000 0.000 0.000 0.000 re.py:273(_compile)
1 0.000 0.000 0.000 0.000 sre_compile.py:172(_compile_charset)
1 0.000 0.000 0.000 0.000 sre_compile.py:201(_optimize_charset)
4 0.000 0.000 0.000 0.000 sre_compile.py:25(_identityfunction)
3/1 0.000 0.000 0.000 0.000 sre_compile.py:33(_compile)
1 0.000 0.000 0.000 0.000 sre_compile.py:341(_compile_info)
2 0.000 0.000 0.000 0.000 sre_compile.py:442(isstring)
1 0.000 0.000 0.000 0.000 sre_compile.py:445(_code)
1 0.000 0.000 0.000 0.000 sre_compile.py:460(compile)
5 0.000 0.000 0.000 0.000 sre_parse.py:126(__len__)
12 0.000 0.000 0.000 0.000 sre_parse.py:130(__getitem__)
7 0.000 0.000 0.000 0.000 sre_parse.py:138(append)
3/1 0.000 0.000 0.000 0.000 sre_parse.py:140(getwidth)
1 0.000 0.000 0.000 0.000 sre_parse.py:178(__init__)
10 0.000 0.000 0.000 0.000 sre_parse.py:183(__next)
2 0.000 0.000 0.000 0.000 sre_parse.py:202(match)
8 0.000 0.000 0.000 0.000 sre_parse.py:208(get)
1 0.000 0.000 0.000 0.000 sre_parse.py:351(_parse_sub)
2 0.000 0.000 0.000 0.000 sre_parse.py:429(_parse)
1 0.000 0.000 0.000 0.000 sre_parse.py:67(__init__)
1 0.000 0.000 0.000 0.000 sre_parse.py:726(fix_flags)
1 0.000 0.000 0.000 0.000 sre_parse.py:738(parse)
3 0.000 0.000 0.000 0.000 sre_parse.py:90(__init__)
1 0.000 0.000 0.000 0.000 {built-in method compile}
1 0.001 0.001 0.001 0.001 {built-in method exec}
17 0.000 0.000 0.000 0.000 {built-in method isinstance}
39/38 0.000 0.000 0.000 0.000 {built-in method len}
2 0.000 0.000 0.000 0.000 {built-in method max}
8 0.000 0.000 0.000 0.000 {built-in method min}
6 0.000 0.000 0.000 0.000 {built-in method ord}
48 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
5 0.000 0.000 0.000 0.000 {method 'find' of 'bytearray' objects}
1 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects}

最佳答案

您的问题是 str(long) 对于 Python 中的大整数(数百万位)非常慢。 It is a quadratic operation (in number of digits) in Python即,对于 ~1e8 位数字,可能需要 ~1e16 次操作才能将整数转换为十进制字符串。

写入一个 500MB 的文件应该不会花费数小时,例如:

$ python3 -c 'open("file", "w").write("a"*500*1000000)'

几乎立即返回。 ls -l file 确认文件已创建且大小符合预期。

计算 math.factorial(67867957)(结果有 ~500M 位)可能需要几个小时,但使用 pickle 保存它是即时的:

import math
import pickle

n = math.factorial(67867957) # takes a long time
with open("file.pickle", "wb") as file:
pickle.dump(n, file) # very fast (comparatively)

使用 n = pickle.load(open('file.pickle', 'rb')) 加载它不到一秒钟。

str(n) 仍在我的机器上运行(50 小时后)。

要快速获得十进制表示,您可以 use gmpy2 :

$ python -c'import gmpy2;open("file.gmpy2", "w").write(str(gmpy2.fac(67867957)))'

在我的机器上花费不到 10 分钟。

关于python - 在 python 中编写巨大的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28420541/

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