如何提高速度创建真正的大组并在Python 3中搜索它们

时间:2014-10-11 18:03:31

标签: python sudoku operation

所以,我需要一些帮助来加速我的程序并提高它的效率,这样它就不会占用太多笔记本电脑无法处理的内存。首先,我正在创建一个解决sudokus的程序。您输入一个普通值(1111111111111111)然后,通过一些操作,更改一些数字,然后它开始检查数独的有效性。如果它不是合法的,它会搜索变量" y",一个类似于计数器/索引的东西,是否属于该组中的一个,并且在它的第一个中,它运行一些总和。你会看到:

tablero = 1111111111111111
g1 = range(4,4294967296,4)
g2 = range(16,4294967296,16)
g3 = range(64,4294967296,64)
g4 = range(256,4294967296,256)
g5 = range(1024,4294967296,1024)
g6 = range(4096,4294967296,4096)
g7 = range(16384,4294967296,16384)
g8 = range(65536,4294967296,65536)
g9 = range(262144,4294967296,262144)
g10 = range(1048576,4294967296,1048576)
g11 = range(4194304,4294967296,4194304)
g12 = range(16777216,4294967296,16777216)
g13 = range(67108864,4294967296,67108864)
g14 = range(268435456,4294967296,268435456)
g15 = range(1073741824,4294967296,1073741824)
g16 = range(500000,4294967296,500000)


y = 1
def nueva_conf():
    global tablero
    global y
    if y in g15:
        tablero = tablero + 700000000000000 - 33333333333333
    elif y in g14:
        tablero = tablero + 70000000000000 - 3333333333333
    elif y in g13:
        tablero = tablero + 7000000000000 - 333333333333
    elif y in g12:
        tablero = tablero + 700000000000 - 33333333333
    elif y in g11:
        tablero = tablero + 70000000000 - 3333333333
    elif y in g10:
        tablero = tablero + 7000000000 - 333333333

    ...

    elif y in g3:
        tablero = tablero + 700 - 33
    elif y in g2:
        tablero = tablero + 70 - 3
    elif y in g1:
        tablero = tablero + 7
    else:
        tablero = tablero + 1

    tablero_copy = tablero
    y = y+1

这是我需要改进的部分,因为它是我认为占据了我记忆的一大块。我真的不知道如何提高效率。我真的希望它以这种方式工作,操作和所有杂项。我已经在尝试另一种解决sudokus的方法,但那是我独立完成的,没有帮助的,我觉得它有可能。你觉得怎么样,Python程序员?

1 个答案:

答案 0 :(得分:1)

不要检查数字列表,只需检查规则是否为真。这要快得多,而且可以程序化:

tablero = 1111111111111111
g_values = [500000, 1073741824, 268435456, 67108864, 16777216, 4194304, 1048576, 262144, 65536, 16384, 4096, 1024, 256, 64, 16, 4, 1]
d_values = [6666666666666667, 666666666666667, 66666666666667, 6666666666667, 666666666667, 66666666667, 6666666667, 666666667, 66666667, 6666667, 666667, 66667, 6667, 667, 67, 7, 1]
y = 1
def nueva_conf():
    global tablero
    global y
    if y > 0 and y <= 4294967296:  # required for all g ranges
        for d, g, i in reversed(zip(d_values, g_values, range(17)):
            if i == 0:
                continue # skip g=500000
            if (y % g) == 0:  # check for divisibility
                tablero += d  # add value
                break         # break out of loop
    tablero_copy = tablero
    y += 1