python-3.x 为什么我的一个几乎相同的算法比其他算法快10倍?

jxct1oxe  于 2023-02-26  发布在  Python
关注(0)|答案(2)|浏览(224)

我是新的编程,所以我不明白一些更深层次的东西.我有一个任务,创建密码数量,与给定的数字和密码longennes.我的第一个代码:

from random import choices, choice

def generate_password(m):
    ch = choices('23456789qwertyupasdfghjkzxcvbnmiLQWERTYUPASDFGHJKZXCVBNM', k=m - 3)
    ch.append(choice('LQWERTYUPASDFGHJKZXCVBNM'))
    ch.append(choice('qwertyupasdfghjkzxcvbnmi'))
    ch.append(choice('23456789'))
    return ''.join(ch)

def main(n, m):
    p = set()
    t = 0
    while t < n:
        s = generate_password(m)
        if s not in p:
            t += 1
            p.add(s)
    return p

工作正常,但是时间太长了,所以后来我尝试了其他方法,随机改进部分代码。那么,为什么这段代码这么快?是不是shuffle()更容易几次,然后只用choice()
x一个一个一个一个x一个一个二个x
输出:0.05657219886779785

from time import time
from random import choices, choice

def generate_password(m):
    ch = choices('23456789qwertyupasdfghjkzxcvbnmiLQWERTYUPASDFGHJKZXCVBNM', k=m - 3)
    ch.append(choice('LQWERTYUPASDFGHJKZXCVBNM'))
    ch.append(choice('qwertyupasdfghjkzxcvbnmi'))
    ch.append(choice('23456789'))
    return ''.join(ch)

def main(n, m):
    p = set()
    t = 0
    while t < n:
        s = generate_password(m)
        if s not in p:
            t += 1
            p.add(s)
    return p



t1 = time()
print(*main(4609, 3))
t2 = time()
print(t2 - t1)

我没有等

jyztefdp

jyztefdp1#

这不是其中一个更快的问题。
该功能:

def generate_password(m):
    ch = choices('23456789qwertyupasdfghjkzxcvbnmiLQWERTYUPASDFGHJKZXCVBNM', k=m - 3)
    ch.append(choice('LQWERTYUPASDFGHJKZXCVBNM'))
    ch.append(choice('qwertyupasdfghjkzxcvbnmi'))
    ch.append(choice('23456789'))
    return ''.join(ch)

使用m=3,只能生成4608个不同的密码。choices调用生成一个列表,因为k=m-3为0。然后,从2个24字符字符串和1个8字符串中随机选择,总共有24 * 24 * 8 = 4608个可能性。
然后你试着循环,直到你生成了4609个不同的密码。
同时,使用此功能:

def generate_password(m):
    global p
    ch = choices('LQWERTYUPASDFGHJKZXCVBNM', k=m - 3)
    ch.append(choice('LQWERTYUPASDFGHJKZXCVBNM'))
    ch.append(choice('qwertyupasdfghjkzxcvbnmi'))
    ch.append(choice('23456789'))
    while True:
        tt = ''.join(ch)
        if tt in p:
            shuffle(ch)
            continue
        return tt

在循环之前,ch也可以是4608种可能性中的一种,但是如果你发现密码已经生成,你可以对ch进行混洗,这意味着大写字母不再被限制在第一个位置,数字也不再被限制在最后。
这个函数可以生成4608个以上的密码,所以一个试图用这个函数生成4609个不同密码的循环实际上可以结束,但是如果密码的所有6个排列都已经生成了,这个函数将无限期地对ch进行 Shuffle 。

cuxqih21

cuxqih212#

在第一种情况下,你用m-2个大写字母、一个小写字母和一个介于2和9之间的数字生成一个随机密码,然后如果没有重复,它就会被添加到密码集中。当你开始累积密码时,重复的几率会增加,所以在得到一个唯一的密码之前,你必须生成多个密码,这就是你提到的速度慢的问题。
现在把它和第二种情况做个比较,如果密码是重复的,你就把字符混洗,直到它不再是重复的。现在,m-2大写字母、一个小写字母和一个数字的顺序不再适用,所以一个密码可以有更多的排列,大大降低了冲突的可能性,而且很可能“总是”发现它是一个唯一的密码。
简单的回答是:后一个代码片段比前一个代码片段生成更多的唯一密码,从而降低了重复的可能性并大大提高了执行速度。

相关问题