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

为何Python List包装类实例化无法达到常量时间?附测试代码

自定义List包装类实例化为何无法达到常量时间?

列表已创建(并非生成器),我仅在类中保存它,而列表是按引用传递的,实在搞不懂为什么实例化耗时不是常量。

问题更新

  • 更新1:在循环开头清除循环变量会将耗时转移到该步骤,但未解决根本问题;
  • 更新2:通过扩展列表避免了清除和重复生成前半列表的耗时。

测试代码与输出结果

类定义

"""
List instantiate test
"""
class List:
    """
    List wrapper
    """
    def __init__(self, a: list[Number]):
        self.list = a

初始主函数

from datetime import datetime, timedelta
Number = int | float
def main() -> None:
    generate_list: timedelta = timedelta()
    instantiate: timedelta = timedelta()
    size: int = 2 ** 25
    while True:
        start: datetime = datetime.now()
        lst: list[Number] = list(range(size, 0, -1))
        generate_list += datetime.now() - start
        print(f"Total time generating lists:            {generate_list}")
        start: datetime = datetime.now()
        _: List = List(lst)
        instantiate += datetime.now() - start
        print(f"Total time instantiating List wrappers: {instantiate}")
        size *= 2

初始输出

Total time generating lists:            0:00:00.849742
Total time instantiating List wrappers: 0:00:00.000019
Total time generating lists:            0:00:02.465526
Total time instantiating List wrappers: 0:00:00.300718
Total time generating lists:            0:00:05.719437
Total time instantiating List wrappers: 0:00:00.985957
...

含清除操作的主函数

def main() -> None:
    generate_list: timedelta = timedelta()
    instantiate: timedelta = timedelta()
    clearing: timedelta = timedelta()
    size: int = 2 ** 25
    lst: list[Number] = []
    lst_wrapper: List = None
    while True:
        start: datetime = datetime.now()
        lst.clear()
        lst_wrapper = None
        clearing += datetime.now() - start
        print(f"Total time clearing:                    {clearing}")
        start: datetime = datetime.now()
        lst = list(range(size, 0, -1))
        generate_list += datetime.now() - start
        print(f"Total time generating lists:            {generate_list}")
        start: datetime = datetime.now()
        lst_wrapper = List(lst)
        instantiate += datetime.now() - start
        print(f"Total time instantiating List wrappers: {instantiate}")
        size *= 2

含清除操作的输出

Total time clearing:                    0:00:00.000005
Total time generating lists:            0:00:00.825880
Total time instantiating List wrappers: 0:00:00.000006
Total time clearing:                    0:00:00.354571
Total time generating lists:            0:00:02.449832
Total time instantiating List wrappers: 0:00:00.000026
Total time clearing:                    0:00:00.996483
Total time generating lists:            0:00:05.796596
Total time instantiating List wrappers: 0:00:00.000046

含扩展操作的主函数

def main() -> None:
    generate_list: timedelta = timedelta()
    instantiate: timedelta = timedelta()
    start: int = 2 ** 24
    end: int = 2 ** 25
    start_time: datetime = datetime.now()
    lst: list[Number] = list(range(0, -start, -1))
    generate_list += datetime.now() - start_time
    print(f"Total time generating lists:            {generate_list}")
    while True:
        start_time = datetime.now()
        lst.extend(range(-start, -end, -1))
        generate_list += datetime.now() - start_time
        print(f"Total time generating lists:            {generate_list}")
        start_time = datetime.now()
        _: List = List(lst)
        instantiate += datetime.now() - start_time
        print(f"Total time instantiating List wrappers: {instantiate}")
        start *= 2
        end *= 2

含扩展操作的输出

Total time generating lists:            0:00:00.514641
Total time generating lists:            0:00:00.981933
Total time instantiating List wrappers: 0:00:00.000005
Total time generating lists:            0:00:01.851684
Total time instantiating List wrappers: 0:00:00.000025
Total time generating lists:            0:00:03.668982
Total time instantiating List wrappers: 0:00:00.000030

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:37:17