我正在解决python中的大量因子,并且发现当我完成计算阶乘时,转换为字符串以保存到文件需要相同的时间。我试图找到一种将int转换为字符串的快速方法。我将举一个计算和int转换时间的例子。我使用的是通用的a = str(a),但是有一种更好的方式,比如使用缓冲区或库。
EX:
解决100,000个阶乘= 456,574个分数
计算时间:6.36秒
转换时间:5.20秒
如果您有任何segestions /解决方案让我知道!一切都会有所帮助。
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")
答案 0 :(得分:4)
您可以尝试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转换时间
答案 1 :(得分:0)
此代码更快(但不够!:D)
<a href="<?php the_field('field-name-1'); ?>">
<?php the_field('field-name-1'); ?>
</a>
无论如何,我认为你可以通过多线程更快地完成它。
导入时间 导入数学 导入线程
╔═══╦════════════╦═════════════╦══════════════╦═══════════════════╗
║ ║ 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