且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Python从int到字符串的快速转换

更新时间:2023-02-09 13:39:37

此代码速度更快(但还不够!:D)

This code is faster (but not enough! :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       ║
╚═══╩════════════╩═════════════╩══════════════╩═══════════════════╝

无论如何,我认为您可以通过多线程来更快地完成它.

Anyway, I think you can do it faster with multi-threading.

导入时间导入数学导入线程

import time import math import threading

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 运行您的代码,速度就非常快!

update:

just run your code with pypy it's amazingly fast!

╔═══╦════════════╦═════════════╦══════════════╦═══════════════════╗
║   ║ 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       ║
╚═══╩════════════╩═════════════╩══════════════╩═══════════════════╝