【问题标题】:Optimizing brute force algorithm优化蛮力算法
【发布时间】:2018-04-19 13:27:20
【问题描述】:

我目前正在创建一个蛮力算法,并且想知道是否有一种方法可以优化我的程序以更快地运行并花费更少的时间来生成所有可能的组合。

import time

# 10.598227977752686 Seconds for 2 characters
# 488.21563148498535 Seconds for 3 characters

start = time.time()

chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '1234567890'

for char1 in chars:

    for char2 in chars:

        for char3 in chars:

            print(char1 + char2 + char3)

end = time.time()

print(end - start)

有没有办法优化这个?

【问题讨论】:

  • @Zinki:应该是itertools.product
  • 您在模块中传递的时间是由于打印功能。删除它可以在不到 0.1 秒的时间内运行 3 个字符。
  • 正如@Jean-FrançoisFabre 所指出的,大部分时间都花在了打印上。因此,您的问题的答案取决于您对数据的处理方式。你可能经常分解一些微积分(比如 char1 + char2)

标签: python optimization brute-force


【解决方案1】:

您的工作台没有实际意义,因为大部分时间都在print 语句和控制台操作中传递。

也就是说,您可以使用 itertools.productstring 模块简化代码:

import itertools,string

chars = string.ascii_letters+string.digits
for t in itertools.product(chars,repeat=3):
    c = "".join(t)
    # do whatever you want with c string

但它在我的一端并没有运行得更快,使用 3 长度的字符串。

4 长度的字符串开始变得有趣,其中 4 个嵌套的 python 循环在我的机器上需要 4 秒,而 itertools.product(chars,repeat=4) 只需要 3 秒。

这是因为itertools.product在主流平台上使用原生代码,这比经典的python循环快得多(如果长度足够大,c = "".join(t)也比逐字符连接快)

【讨论】:

    【解决方案2】:

    你可以使用一些itertools power:

    from itertools import product
    list(product(chars, chars, chars))
    

    当时间安排时:

    28.2 ms ± 1.21 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多