2012-09-03 80 views
-2

我发现我的Python代码实在是太慢了,用8分钟相比,1分钟完成到freebasic
任何人都可以请提出一些优化蟒蛇性能相比freebasic

首先创建digit_array [“一”,” b”, “C”, “d”, “E”, “F”, “G”, “H”, “I”, “J”]。
把它分开,得到余数,一次又一次地存入array_index [],最后一位数字为1。
否则if和else代码处理最后一次迭代未完成除法。
将最大索引存储为变量i。从最高值到1
然后循环array_index,映射它到digit_array,
然后产生一个字符串(代码注释)

加入:20120903
我使此与来自digit_array字母组合创建字符串,所以我可以跳过一些不常见的字母,比如'q''z'或者像'4'这样的一些数字
currpos可以让我从上次开始
x让我调整digit_array中的总字母,可以是a-z + A-Z + 0-9 +''
currpos_end 1024th将给,
结果1024如果digit_array是['' 0','1','2','3','4','5','6','7','8','9'],x = 10
结果bace if digit_array是['a','b','c','d','e','f','g','h','i','j'],x = 10
结果1467如果digit_array是['0','1','2','3','4','5','6','7','8'],x = 9
结果2000如果digit_array是['0','1','2','3','4','5','6','7'],x = 8
现在我可以打印结果了,仅在性能

蟒3代码慢,

digit_array=[] 
    for i in range(0, 10): # range(10) ----> 0 1 2 3 4 ... 9 
     digit_array.append("") 
    digit_array[0] = "a" 
    digit_array[1] = "b" 
    digit_array[2] = "c" 
    digit_array[3] = "d" 
    digit_array[4] = "e" 
    digit_array[5] = "f" 
    digit_array[6] = "g" 
    digit_array[7] = "h" 
    digit_array[8] = "i" 
    digit_array[9] = "j" 

    array_index=[] 
    for i in range(0, 51): 
     array_index.append(0) 

    currpos = 0 
    currpos_end = pow((26+10+1),5) 
    #currpos_end = 1024 
    print (currpos) 
    currpos2 = currpos 
    x = 10 # ubound digit_array + 1, ("0","1") binary then x = 2 
    print() 

    for currpos in range(currpos, currpos_end): 

     currpos2 = currpos 
     i = 1 

     while True : 
      if currpos2 > x: 
       array_index[i] = currpos2 % x 
       currpos2 = int(currpos2/x) 
      elif currpos2 == x: 
       array_index[i] = 0 
       i += 1 
       array_index[i] = 1 
       break 
      else: 
       array_index[i] = currpos2 
       break 
      i += 1 

     print (i, " . ", currpos, currpos2) 

     for j in range(i , 1, -1): 
     # break #uncomment this and comment next 3 lines for speed testing 
      print (digit_array[array_index[j]], end='') 
     print (digit_array[array_index[1]], end='') 
     print() 

    try: 
     input(".") 
    except: 
     pass 

freebasic代码,

Dim digit_array(0 To 100) As String 
    digit_array(0) = "a" 
    digit_array(1) = "b" 
    digit_array(2) = "c" 
    digit_array(3) = "d" 
    digit_array(4) = "e" 
    digit_array(5) = "f" 
    digit_array(6) = "g" 
    digit_array(7) = "h" 
    digit_array(8) = "i" 
    digit_array(9) = "j" 

    Dim array_index(0 To 50) As ULongInt 
    For i As Integer = 0 To 50 
     array_index(i) = 0 
    Next 

    Dim As ULongInt currpos 
    Dim As ULongInt currpos_end 
    Dim As ULongInt currpos2 
    Dim As ULongInt x = 10 'ubound digit_array + 1, ("0","1") binary then x = 2 
    Dim As ULongInt i 

    currpos = 0 
    currpos_end = (26+10+1)^5 
    'currpos_end = 1024 
    Print currpos 
    currpos2 = currpos 
    Print 

    For currpos = currpos To currpos_end 

     currpos2 = currpos 
     i = 1 

     Do 
      If currpos2 > x Then 
       array_index(i) = currpos2 Mod x 
       currpos2 = CULngInt(currpos2/x) 
      ElseIf currpos2 = x Then 
       array_index(i) = 0 
       i += 1 
       array_index(i) = 1 
       Exit Do 
      Else 
       array_index(i) = currpos2 
       Exit Do 
      EndIf 
      i += 1 
     Loop 

     'Print i; " . "; currpos; " "; currpos2 

     '''first = i Until 1 = last 
     For j As Integer = i To 1 Step -1 
      'Print digit_array(array_index(j)); 
     Next 
     'Print 

     'Sleep 
    Next 

    Print "." 
    Sleep 
+1

上codereview.stackexchange也许更好.com –

+7

目前还不清楚你想要做什么,你必须澄清你的doi NG。 – monkut

+0

为什么不是digit_array ='abcdefghij'和array_index = [[0] * 50]?否则 - 问题到底是什么,你想达到什么目的? –

回答

1

THX How to convert an integer in any base to a string?

def calculation(): 
    while 1: 
     global s, n 
     r = n % base 
     if r == 0: return 
     s = digits[r] + s 
     n = n // base 
     if n == 0: return 

#     .   .   . 
digits = "X" 
digits = "X23456789AJKQ" #first digit not use, remain for calculation 
currpos = 0 
currpos = 30941 #22222 base13 13^4+13^3+13^2+13+1 
#currpos_end = 371292 #QQQQQ base13 13^5-1 
currpos_end = pow((26+10+1),5) 
currpos_end = 371292 
#currpos_end = 1024 
base = len(digits) 
print (currpos) 
print (base) 
print() 

for currpos in range(currpos, currpos_end): 
    n = currpos 
    s = "" 
    calculation() 
    if s == "": 
     continue 
    print (s, " . ", currpos, " . ", n) 
    #do something here with s 
0

为了好玩,我试图弄清楚你想在代码中做什么,但放弃了。

总之,这里的一些代码的清理了一下:

digit_array=[ 
      "a", 
      "b", 
      "c", 
      "d", 
      "e", 
      "f", 
      "g", 
      "h", 
      "i", 
      "j" 
      ] 

array_index = [0] * 51 

#currpos_end = pow((26+10+1),5) 
currpos_end = 1024 

x = 10 # ubound digit_array + 1, ("0","1") binary then x = 2 
for currpos in range(currpos_end): 
    i = 1 
    while True : 
     if currpos > x: 
      array_index[i] = currpos % x 
      currpos = int(currpos/x) 

     elif currpos == x: 
      array_index[i] = 0 
      i += 1 
      array_index[i] = 1 
      break 

     else: 
      array_index[i] = currpos 
      break 
     i += 1 

result = "".join([digit_array[i] for i in array_index]) 
print(result) 

,这将产生的结果:

adcabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
+0

一个目的和将是有用的,在原始版本OP是循环到69343957。很难解决什么/为什么 –