为何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
相关产品推荐
相关产品推荐

