【问题标题】:Which of these 2 codes is more efficient?这两个代码中哪个更有效?
【发布时间】:2019-06-08 19:45:29
【问题描述】:

我是学习python和整体编程的新手,我想知道这两个代码中哪一个对下一个问题更有效:

编写一个程序来删除现有列表中的重复项。

第一个代码是我在没有使用另一个占用内存的变量的情况下设法构建的代码(?), 我知道构建一个嵌套循环会占用大量内存,但因为我使用了“while”循环并且它仅用于删除数字,所以这并没有什么不同。

  1. 我的代码:
List = [5,2,9,1,7,2,2,3,9]
for item in List:
    while(List.count(item) >= 2):
        List.remove(item)
print(List)
  1. 第二个代码:
List = [5,2,9,1,7,2,2,3,9]
New_List = []
for item in List:
    if item not in New_List:
       New_List.append(item)
print(New_List)

两者都可以正常工作并且问题并不是说您不能将数据作为列表存储在另一个变量中,总体而言哪个代码更高效?

【问题讨论】:

  • 你确定两者都能正常工作吗?在迭代列表时删除列表中的项目是不受欢迎的。

标签: python-3.x performance memory-efficient


【解决方案1】:

肯定是第二个,原因有很多:

  • 永远不要使用第一个。遍历列表并同时删除项目是不安全的。
  • 从列表中删除一个项目是一项 O(n) 繁重的任务,因为您总是需要复制一半的列表。

因此,在 O 表示法中,您具有以下缩放行为:

  • 首先:计算:O(n^2);空间:O(n),确切地说是 2*n
  • 秒:计算:O(n),空间:O(n),确切地说是 3*n

【讨论】:

  • 您介意扩展一下迭代列表并同时删除吗?是什么让它不安全?
  • 在几乎所有编程语言中,这都会导致未定义的行为。迭代器几乎总是假设在迭代期间不会添加/删除项目。在 python 中可能发生的最糟糕的事情是你的迭代器奇怪地迭代。其他语言(如 C/C++)中最糟糕的情况是程序由于内存重新分配而崩溃。有关 python 的更多信息:unspecified.wordpress.com/2009/02/12/…
猜你喜欢
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多