Python从int到string的快速转换

时间:2018-01-07 07:35:10

标签: python string python-2.7 type-conversion converter

我正在解决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")

2 个答案:

答案 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