You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取代码执行时间?实现密码生成器的超时检测逻辑

密码生成器执行时间检测需求及代码优化

我需要获取代码的执行时间,以此实现条件判断:当执行时间超过5秒时,执行后续代码。我正在开发一款密码生成器,可生成以指定字符开头或结尾的密码。当因无符合条件的密码导致打印功能“冻结”无输出时,需借助执行时间检测处理该情况。

当前代码如下:

while True:
    sample = random.sample(string, lenght)
    x = ''
    if x in passwords:
        continue
    else:
        if starts["enabled"] == True or ends['enabled'] == True:
            counter += 1
            x = ''.join(sample)
            if starts['enabled'] == True and ends['enabled'] == True:
                if x.startswith(starts['startWith']) and x.endswith(ends['endWith']):
                    if x in passwords:
                        continue
                    else:
                        print(f"# {counter}. {x}")
                        passwords.append(x)
            if starts['enabled'] == False and ends['enabled'] == False:
                if x in passwords:
                        continue
                else:
                    print(f"# {counter}. {x}")
                    passwords.append(x)
            if starts['enabled'] == True and ends['enabled'] == False:
                if x.startswith(starts['startWith']):
                    if x in passwords:
                        continue
                    else:
                        print(f"# {counter}. {x}")
                        passwords.append(x)
            if starts['enabled'] == False and ends['enabled'] == True:
                if x.endswith(ends['endWith']):
                    if x in passwords:
                        continue
                    else:
                        print(f"# {counter}. {x}")
                        passwords.append(x)
        else:
            counter += 1
            x = ''.join(sample)
            print(f"# {counter}. {x}")
    if timeit.timeit('print(f"# {counter}. {x}")', number=1) >= 5:
        print("Thats all..")
        pass
    if len(passwords) == len_pass or len(passwords) <= len_pass:
        if len(passwords) == len(string) ** lenght:
            print("\n")
            print(f"{passwords}\n")
            break
        if len(passwords) == len_pass:
            print("\n")
            print(f"{passwords}\n")
            break

问题分析与修正方案

原代码中用timeit.timeit检测打印语句的执行时间是错误的,它无法反映整个循环的实际运行时长。正确做法是记录循环启动的时间,实时计算已消耗时长,当超过5秒时触发终止逻辑。

优化后的代码示例

import time
import random
import string

# 假设以下变量已提前定义
string = "abc123"
lenght = 4
len_pass = 10
passwords = []
counter = 0
starts = {"enabled": True, "startWith": "a"}
ends = {"enabled": False, "endWith": "3"}

# 记录循环开始时间
start_time = time.time()

while True:
    # 计算已运行时长,超过5秒则终止
    elapsed_time = time.time() - start_time
    if elapsed_time >= 5:
        print("已无符合条件的密码可生成")
        break
    
    sample = random.sample(string, lenght)
    x = ''.join(sample)
    
    # 跳过已生成的重复密码
    if x in passwords:
        continue
    
    counter += 1
    # 统一判断密码是否符合开头/结尾要求
    valid = False
    if starts["enabled"] and ends["enabled"]:
        valid = x.startswith(starts['startWith']) and x.endswith(ends['endWith'])
    elif starts["enabled"]:
        valid = x.startswith(starts['startWith'])
    elif ends["enabled"]:
        valid = x.endswith(ends['endWith'])
    else:
        valid = True  # 无限制则默认有效
    
    if valid:
        print(f"# {counter}. {x}")
        passwords.append(x)
    
    # 检查是否达到生成数量上限或穷尽所有可能密码
    if len(passwords) >= len_pass or len(passwords) == len(string) ** lenght:
        print("\n")
        print(f"{passwords}\n")
        break

优化说明

  1. 时间检测逻辑修正:用time.time()记录起始时间,实时计算循环运行时长,准确捕捉无输出的“冻结”状态。
  2. 代码结构简化:将多分支的条件判断合并为valid变量的统一判断,减少冗余代码,提升可读性。
  3. 重复密码提前过滤:生成密码后立即检查是否已存在,避免后续无效的条件判断。
  4. 终止条件优化:简化原代码中冗余的长度判断逻辑,使终止条件更清晰。

内容的提问来源于stack exchange,提问作者Vidmo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:50:22