[英]Python Fast conversion from int to string
我正在解决 python 中的大量阶乘,并发现当我计算完阶乘后,转换为字符串以保存到文件需要相同的时间。 我试图找到一种将 int 转换为字符串的快速方法。 我将举一个计算和int转换时间的例子。 我正在使用通用的 a = str(a) 但我觉得有更好的方法,比如使用缓冲区或库。
前任:
求解 100,000 阶乘 = 456,574 Digets
计算时间:6.36 秒
转换时间:5.20 秒
如果您有任何问题/解决方案,请告诉我! 任何事情都会有所帮助。
import time
factorial = 1
print(" ")
one = int(input("lower = "))
two = int(input("higher = "))
start = time.time()
for x in range(one,two + 1):
factorial = factorial * two
two = two - 1
end = time.time()
print("DONE! ")
print(end - start, "Seconds to compute")
start = time.time()
factorial = str(factorial)
f = open('Ans_1.txt','w')
f.write(factorial)
f.close()
end = time.time()
print(end - start, "Seconds to convert and save")
print(len(factorial), "Digets")
你可以尝试gmpy2 x.digits([base])。
import time
from gmpy2 import mpz
x = 123456789**12345
start = time.time()
python_str = str(x)
end = time.time()
print(end - start, "Python conversion time")
r = mpz(x)
start = time.time()
gmpy2_str = r.digits()
end = time.time()
print(end-start, "gmpy2 conversion time")
以上测试输出:
1.0336394309997559 Python转换时间
0.03306150436401367 gmpy2转换时间
这段代码更快(但还不够!:D)
╔═══╦════════════╦═════════════╦══════════════╦═══════════════════╗
║ ║ Count ║ Compute(s) ║ Convert(s) ║ M.T Convert(s) ║
╠═══╬════════════╬═════════════╬══════════════╬═══════════════════╣
║ 1 ║ 100,000 ║ 2.68 ║ 3.85 ║ 2.81 ║
║ 2 ║ 250,000 ║ 21.17 ║ 39.83 ║ 21.09 ║
╚═══╩════════════╩═════════════╩══════════════╩═══════════════════╝
无论如何,我认为你可以通过多线程更快地完成它。
导入时间导入数学导入线程
res_dict = {}
def int_str(threadID, each_thread, max_thread):
if threadID == 1 :
res_dict[threadID] = (str(factorial // 10 ** (each_thread * (max_thread - 1))))
elif threadID == max_thread:
res_dict[threadID] = (str(int(factorial % 10 ** (each_thread * 1))))
else:
tmp = (factorial % 10 ** (each_thread * (max_thread - threadID + 1))) // 10 ** (each_thread * (max_thread - threadID))
pre = "0" * ((digits // max_thread) - (math.floor(math.log10(tmp))+1))
res_dict[threadID] = (pre + str(int(tmp)))
factorial = 1
print(" ")
def fact(a,b):
if b == 1:
return 1
else:
return a * fact(a,b-1)
one = int(input("lower = "))
two = int(input("higher = "))
start = time.time()
for x in range(one,two + 1):
factorial = factorial * two
two = two - 1
end = time.time()
print("DONE! ")
print(end - start, "Seconds to compute")
start = time.time()
digits = math.floor(math.log10(factorial))+1
max_thread = 3
each_thread = digits // max_thread
tr = []
for item in range(1, max_thread + 1):
t = threading.Thread(target=int_str, args=(item, each_thread, max_thread))
t.start()
tr.append(t)
for item in tr:
item.join()
last_res = ''
for item in sorted(res_dict):
if item != max_thread:
last_res += res_dict[item]
else:
last_res += ("0" * (digits - len(last_res) - len(res_dict[item]))) + res_dict[item]
f = open('Ans_2.txt','w')
f.write(last_res)
f.close()
end = time.time()
print(end - start, "Seconds to convert and save")
print(digits, "Digets")
只需用pypy
运行你的代码就会非常快!
╔═══╦════════════╦═════════════╦══════════════╦═══════════════════╗
║ ║ Count ║ Compute(s) ║ Convert(s) ║ pypy Convert(s) ║
╠═══╬════════════╬═════════════╬══════════════╬═══════════════════╣
║ 1 ║ 100,000 ║ 2.98 ║ 3.85 ║ 0.79 ║
║ 2 ║ 250,000 ║ 25.83 ║ 39.83 ║ 7.17 ║
╚═══╩════════════╩═════════════╩══════════════╩═══════════════════╝
int().__str__()
比str(int)
快,因为str()
需要找到它正在转换的类型。
import time
start=time.time()
x1=[x.__str__() for x in range(10000)]
print(f"__str__: {time.time()-start}")
start=time.time()
x2=[str(x) for x in range(10000)]
print(f"str: {time.time()-start}")
print(x1==x2)
>>>__str__: 0.005000591278076172
>>>str: 0.006000518798828125
>>>True
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.