Questions tagged «cpython»

Python编程语言的参考实现。使用此标签来解决特定于此实现的问题,一般的Python问题应仅标有“ python”。

3
为什么Python代码在函数中运行得更快?
def main(): for i in xrange(10**8): pass main() Python中的这段代码在其中运行(注意:计时是通过Linux中的BASH中的time函数完成的。) real 0m1.841s user 0m1.828s sys 0m0.012s 但是,如果for循环未放在函数中, for i in xrange(10**8): pass 那么它会运行更长的时间: real 0m4.543s user 0m4.524s sys 0m0.012s 为什么是这样?

12
如果PyPy快6.3倍,为什么我不应该在CPython上使用PyPy?
我已经听到很多有关PyPy项目的信息。他们声称它比其站点上的CPython解释器快6.3倍。 每当我们谈论诸如Python之类的动态语言时,速度都是头等大事。为了解决这个问题,他们说PyPy快6.3倍。 第二个问题是并行性,臭名昭著的Global Interpreter Lock(GIL)。为此,PyPy表示可以提供无GIL的Python。 如果PyPy可以解决这些巨大的挑战,那么它的哪些弱点正在阻碍广泛采用?也就是说,是什么原因导致我这样的人,一个典型的Python开发,切换到PyPy 现在?

9
Python与Cpython
关于Python和CPython (Jython,IronPython)的所有这些大惊小怪,我不明白: python.org提到CPython是: Python的“传统”实现(绰号为CPython) 另一个堆栈溢出问题提到: CPython是Python的默认字节码解释器,它是用C编写的。 老实说,我并没有得到这两种解释的实际含义,但是我认为的是,如果我使用CPython,那意味着当我运行示例python代码时,它将其编译为C语言,然后像执行C语言一样执行它码 那么CPython到底是什么?与python相比,它有什么区别?我应该在Python上使用CPython吗?如果有,它的优点是什么?
447 python  cpython 

2
为什么有些float <整数比较的速度慢四倍?
将浮点数与整数进行比较时,某些值对的评估时间要比其他类似幅度的值花费更长的时间。 例如: &gt;&gt;&gt; import timeit &gt;&gt;&gt; timeit.timeit("562949953420000.7 &lt; 562949953421000") # run 1 million times 0.5387085462592742 但是,如果将float或整数变小或变大一定数量,则比较会更快地运行: &gt;&gt;&gt; timeit.timeit("562949953420000.7 &lt; 562949953422000") # integer increased by 1000 0.1481498428446173 &gt;&gt;&gt; timeit.timeit("562949953423001.8 &lt; 562949953421000") # float increased by 3001.1 0.1459577925548956 更改比较运算符(例如使用==或&gt;代替)不会以任何明显的方式影响时间。 这不只是涉及到大小,因为采摘较大或较小的值会导致比较快,所以我怀疑它已经降到了一些不幸的方式位排队。 显然,对于大多数用例而言,比较这些值已足够快。我只是对为什么Python似乎在某些价值观上比在其他价值观上挣扎更多感到好奇。

5
set()如何实现?
我见过有人说setpython 中的对象具有O(1)成员资格检查。如何在内部实现它们以允许这样做?它使用哪种数据结构?该实现还有什么其他含义? 这里的每个答案都非常有启发性,但是我只能接受一个答案,因此,我将选择与原始问题最接近的答案。谢谢你的信息!

3
是什么导致[* a]总体化?
显然list(a)不是总归,[x for x in a]在某些时候[*a]总归,始终都是总归吗? 这是从0到12的大小n,以及三种方法的结果大小(以字节为单位): 0 56 56 56 1 64 88 88 2 72 88 96 3 80 88 104 4 88 88 112 5 96 120 120 6 104 120 128 7 112 120 136 8 120 120 152 9 128 184 184 10 136 184 192 …

3
为什么迭代一小串字符串比一小串列表慢?
我在玩timeit时发现,对小字符串进行简单的列表理解要比对小字符串列表进行相同的操作花费的时间更长。有什么解释吗?时间几乎是原来的1.35倍。 &gt;&gt;&gt; from timeit import timeit &gt;&gt;&gt; timeit("[x for x in 'abc']") 2.0691067844831528 &gt;&gt;&gt; timeit("[x for x in ['a', 'b', 'c']]") 1.5286479570345861 导致此情况的较低级别发生了什么?

1
为什么tuple(set([(1,“ a”,“ b”,“ c”,“ z”,“ f”]))==元组(set([(a,b,c) “ z”,“ f”,1]))85%的时间启用了哈希随机化?
鉴于零比雷埃夫斯对另一个问题的回答,我们认为 x = tuple(set([1, "a", "b", "c", "z", "f"])) y = tuple(set(["a", "b", "c", "z", "f", 1])) print(x == y) True在启用散列随机化的情况下,大约打印时间的85%。为什么是85%?

10
IronPython与Python .NET
我想从Python代码访问一些用C#编写的.NET程序集。 一项小小的研究表明,我有两种选择: 内置.NET接口功能/支持的IronPython 带有Python .NET包的Python 两种解决方案之间的权衡是什么?

2
list()比列表理解使用更多的内存
因此,我在玩list对象时发现一点奇怪的事情:如果list用list()它创建的东西比列表理解力要占用更多的内存?我正在使用Python 3.5.2 In [1]: import sys In [2]: a = list(range(100)) In [3]: sys.getsizeof(a) Out[3]: 1008 In [4]: b = [i for i in range(100)] In [5]: sys.getsizeof(b) Out[5]: 912 In [6]: type(a) == type(b) Out[6]: True In [7]: a == b Out[7]: True In [8]: sys.getsizeof(list(b)) Out[8]: 1008 从文档: …

2
为什么使用中间变量的代码要比不使用中间变量的代码快?
我遇到这种奇怪的行为,但无法解释。这些是基准: py -3 -m timeit "tuple(range(2000)) == tuple(range(2000))" 10000 loops, best of 3: 97.7 usec per loop py -3 -m timeit "a = tuple(range(2000)); b = tuple(range(2000)); a==b" 10000 loops, best of 3: 70.7 usec per loop 与使用变量分配进行比较,为什么比使用带有临时变量的班轮快27%以上呢? 通过Python文档,垃圾回收在timeit期间被禁用,因此并非如此。这是某种优化吗? 结果也可以在Python 2.x中重现,尽管程度较小。 运行Windows 7,CPython 3.5.1,Intel i7 3.40 GHz,64位OS和Python。似乎我尝试使用Python 3.5.0在Intel i7 3.60 …


2
为什么Python集不保留插入顺序?
最近我很惊讶地发现,虽然保证字典可以保留Python 3.7+中的插入顺序,但集合却不能: &gt;&gt;&gt; d = {'a': 1, 'b': 2, 'c': 3} &gt;&gt;&gt; d {'a': 1, 'b': 2, 'c': 3} &gt;&gt;&gt; d['d'] = 4 &gt;&gt;&gt; d {'a': 1, 'b': 2, 'c': 3, 'd': 4} &gt;&gt;&gt; s = {'a', 'b', 'c'} &gt;&gt;&gt; s {'b', 'a', 'c'} &gt;&gt;&gt; s.add('d') &gt;&gt;&gt; s {'d', 'b', …
12 python  set  cpython 

4
与列表切片相反,元组切片不返回新对象
在Python(2和3)中。每当我们使用列表切片时,它都会返回一个新对象,例如: l1 = [1,2,3,4] print(id(l1)) l2 = l1[:] print(id(l2)) 输出量 &gt;&gt;&gt; 140344378384464 &gt;&gt;&gt; 140344378387272 如果用元组重复相同的事情,则返回相同的对象,例如: t1 = (1,2,3,4) t2 = t1[:] print(id(t1)) print(id(t2)) 输出量 &gt;&gt;&gt; 140344379214896 &gt;&gt;&gt; 140344379214896 如果有人能弄清为什么会发生,那将是很棒的,在我的整个Python经验中,我一直以为空切片会返回一个新对象为印象。 我的理解是,它返回的对象与元组是不可变的相同,因此没有必要为其创建新副本。但是同样,文档中也没有提到它。
12 python  list  tuples  slice  cpython 

2
为什么在类上设置描述符会覆盖描述符?
简单再现: class VocalDescriptor(object): def __get__(self, obj, objtype): print('__get__, obj={}, objtype={}'.format(obj, objtype)) def __set__(self, obj, val): print('__set__') class B(object): v = VocalDescriptor() B.v # prints "__get__, obj=None, objtype=&lt;class '__main__.B'&gt;" B.v = 3 # does not print "__set__", evidently does not trigger descriptor B.v # does not print anything, we overwrote the …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.