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

如何提高速度在Python3中创建真正大的组并搜索它们,python,sudoku,operation,Python,Sudoku,Operation,所以,我需要一些帮助来加速我的程序,提高效率,这样就不会占用笔记本电脑无法处理的内存。首先,我正在创建一个解决数独问题的程序。您输入一个普通值(1111111111),然后通过一些操作,更改一些数字,然后它开始检查数独的有效性。如果它不是合法的,它会搜索变量“y”,一个类似计数器/索引的东西,是否在其中一个组中,并且在第一个组中,它会进行一些求和。您将看到: tablero = 1111111111111111 g1 = range(4,4294967296,4) g2 = range(16,4

所以,我需要一些帮助来加速我的程序,提高效率,这样就不会占用笔记本电脑无法处理的内存。首先,我正在创建一个解决数独问题的程序。您输入一个普通值(1111111111),然后通过一些操作,更改一些数字,然后它开始检查数独的有效性。如果它不是合法的,它会搜索变量“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

这是我需要改进的部分,因为我认为这会消耗我的大部分记忆。我真的不知道如何使它更有效率。我真的希望它能以这种方式工作,包括各种各样的操作。我已经在研究另一种解决数独的方法,但这是我在没有帮助的情况下独立制作的,我觉得这是有可能的。Python程序员们,你们觉得怎么样?

与其对照数字列表进行检查,不如检查规则是否正确。这要快得多,而且可以程序化:

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
tablero=1111111
g_值=[500000、1073741824、268435456、67108864、16777216、4194304、1048576、262144、65536、16384、4096、1024、256、64、16、4、1]
d_值=[66666666667、66666666667、666666667、6666667、6666666 7、666666667、666666667、6666666 7、666666667、6666666 7、6666666 7、6666667、6666667、66667、67、7、1]
y=1
def nueva_conf():
全球表格
全局y

如果y>0,问题是,它们不仅仅是数字,而是范围。我的意思是,在g1组中,你有4个,所有的倍数都是4294967296(4,8,12,16,20,24,等等)。我不确定您的解决方案是否考虑到了这个问题。@user3870619这个答案中的想法是我们将测试分成“4人一组,它的倍数高达4294967296”,有三个要求:它是否大于0,y>0?它是否小于或等于4294967296?它是4的倍数,(y%4)==0吗?该范围内的所有数字,只有该范围内的数字,都满足这些测试。你可以称我为白痴:“)我已经实现了你的解决方案,它看起来比我的要好,但是,我不知道为什么,在你的解决方案和我的解决方案中,在前500000次操作之后,抛出第一个数字同样需要11秒钟。你知道为什么吗?(感谢您的解决方案,即使在it行业工作了3个月,我也无法理解这种代码)@user3870619我永远不会称您为白痴!而且,我不知道为什么它所花费的时间仍然很大。我不知道为什么我的代码与原始代码的运行速度大致相同。可能是Python正在帮助优化
范围
结果。:)最后一个问题。我一直在自己尝试,但仍然无法理解d,g的
是如何反转的(zip(d_值[1:],g_值[1:])
语句。我的意思是,你把d和g作为局部变量,但是为什么你需要使用zip()而不能手动连接它,或者计算机如何知道取哪个数作为d,哪个数作为g?另外,它也可以在没有reversed()方法的情况下工作,不知道如何/为什么。我使用的是Python3.4,也许这与速度有关。谢谢你的帮助,真的。