当前位置: 首页 > 面试题库 >

Python-你是否应该始终偏爱xrange()而不是range()?

莘聪
2023-03-14
问题内容

为什么或者为什么不?


问题答案:

对于性能而言,尤其是在较大范围内进行迭代时,xrange()通常会更好。但是,在某些情况下,你可能更喜欢range()

  • 在Python 3,range()做什么xrange()用做的,xrange()不存在。如果要编写可在Python 2和Python 3上运行的代码,则不能使用xrange()

  • range()在某些情况下实际上可以更快-例如。如果多次重复相同的序列。 xrange()每次都必须重新构造整数对象,但是range()将拥有真正的整数对象。(但是,在内存方面,它总是会表现得更差)

  • xrange()在需要真实列表的所有情况下都不可用。例如,它不支持切片或任何列表方法。

[编辑]有range()几篇文章提到2to3工具将如何升级。为了记录在案,这里是对一些用法示例运行该工具的输出range()xrange()

RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: ws_comma
--- range_test.py (original)
+++ range_test.py (refactored)
@@ -1,7 +1,7 @@

 for x in range(20):
-    a=range(20)
+    a=list(range(20))
     b=list(range(20))
     c=[x for x in range(20)]
     d=(x for x in range(20))
-    e=xrange(20)
+    e=range(20)

如你所见,当在for循环或理解中使用时,或已经用list()包装的地方,范围保持不变。



 类似资料:
  • 问题内容: 偏重于继承而不是继承 是非常流行的短语。我读了几篇文章,最后每篇文章都说 当类之间存在纯IS-A关系时,请使用继承。 本文中的一个示例: 在 Apple 和 Fruit 之间存在明显的IS-A关系,即Apple IS-A Fruit,但作者也将其显示为Apple HAS-A Fruit(组成),以显示通过继承实现时的陷阱。 我在这里变得有些困惑,声明的含义是什么 当类之间存在纯IS-A

  • 问题内容: 在Java <1.5中,常量将像这样实现 并且您可以像这样使用它: 现在,显然在1.5中,您应该使用枚举: 现在您可以像这样使用它: 我觉得有点难看。现在,我可以轻松添加几个静态变量: 现在,我可以再次执行此操作: 具有枚举的所有类型安全性。 这是好风格还是坏风格?您能想到更好的解决方案吗? 更新资料 Vilx-是第一个强调我所缺少的东西的人-枚举应该是一等公民。在Java中,这意味着

  • C# 有两种常量:编译时常量和运行时常量。它们有不同的行为,不当使用会花费性能或出现错误。如果不得不选择其中一个,宁可是一个慢一点但正确的程序,而不是一个快速但会出错的程序。出于这个考虑,你应该更偏向于运行时常量而不是编译时常量。编译时常量会比编译时常量稍微快点,但更不灵活。只有当性能是一个致命因素而且要求常量不随版本发生改变时才会保留编译时常量。 你可以使用 readonly 关键字声明运行时常

  • 问题内容: 我了解都和工作。我想知道是否有什么可以做的? 即可以使用以下模式替换: 我想问的是,我想让Python OO的这一方面更适合我。 问题答案: guido帖子中的一个可能答案(感谢@ fraca7): 例如,在pickle模块中,用于反序列化对象时创建实例。在这种情况下,将创建实例,但不会调用该方法。 还有其他类似的答案吗? 我接受这个答案是对我自己的问题的“是”: 我想知道是否有什么可

  • 问题内容: 导入总是放在文件的顶部,紧随任何模块注释和文档字符串之后,以及模块全局变量和常量之前。 但是,如果我要导入的类/方法/函数仅在极少数情况下使用,那么确定在需要时进行导入肯定会更有效吗? 这不是吗? 比这更有效? 问题答案: 模块导入非常快,但不是即时的。这意味着: 将导入放在模块顶部很好,因为这是微不足道的成本,只需要支付一次即可。 将导入放在函数中将导致对该函数的调用花费更长时间。

  • 问题内容: 可以从许多线程访问类。在这种情况下,必须是记录器还是最终的和静态的?谢谢。 问题答案: 所有主要的Java日志记录程序包(等)都是同步的并且是线程安全的。即使从多个线程调用该类,每个类的记录器的标准模式也可以。