Search code examples
pythonstringpython-2.7type-conversionconverters

Python Fast conversion from int to string


I am solving massive factorials in python and have found that when I am done calculating the factorial it takes the same time to convert to string to save to a file. I have tried to find a fast way to convert an int to string. I will put an example of computation and int conversion time. I am using the generic a = str(a) but fell like there is a better way like using a buffer or library.

EX:

Solving 100,000 factorial = 456,574 Digets

Computation time: 6.36 Seconds

Conversion time: 5.20 Seconds

If you have any segestions / solutions let me know! Anything will help.

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")

Solution

  • This code is faster (but not enough! :D)

    result:

    ╔═══╦════════════╦═════════════╦══════════════╦═══════════════════╗
    ║   ║ 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")
    

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