标签: cpython

为什么Python优化"if 0",而不是"if None"?

如果你编译一个像这样的条件表达式,为什么呢?

def f():
    if None:
        print(222)
    if 0:
        print(333)
Run Code Online (Sandbox Code Playgroud)

使用数字的分支得到优化,但那些使用的分支None没有?例:

 3        0 LOAD_CONST               0 (None)
          3 POP_JUMP_IF_FALSE       14

 4        6 LOAD_CONST               1 (222)
          9 PRINT_ITEM          
         10 PRINT_NEWLINE       
         11 JUMP_FORWARD             0 (to 14)

 5  >>   14 LOAD_CONST               0 (None)
         17 RETURN_VALUE        
Run Code Online (Sandbox Code Playgroud)

在哪些情况下可以if 0if None表现不同?

python cpython python-2.7

19
推荐指数
1
解决办法
515
查看次数

Python的C扩展中的Docstrings?

在为Python创建C扩展时,是否有可能以某种方式将扩展为文档字符串的注释写入扩展的用户?

python cpython python-c-extension

18
推荐指数
1
解决办法
2083
查看次数

s=s+c 字符串连接优化是如何决定的?

简短版本:如果s是字符串,则s = s + \'c\'可以就地修改字符串,但t = s + \'c\'不能。但是操作如何s + \'c\'知道它处于哪种场景呢?

\n

长版:

\n

t = s + \'c\'需要创建一个单独的字符串,因为程序随后需要旧字符串 ass和新字符串 as t

\n

s = s + \'c\'如果是唯一的引用,则可以就地修改字符串s,因为程序只想s成为扩展字符串。如果末尾有多余字符的空间,CPython 实际上会执行此优化。

\n

考虑这些重复添加字符的函数:

\n
def fast(n):\n    s = \'\'\n    for _ in range(n):\n        s = s + \'c\'\n        t = s\n        del t\n\ndef slow(n):\n    s = \'\'\n    for _ in range(n):\n        t = s …
Run Code Online (Sandbox Code Playgroud)

python performance cpython internals

18
推荐指数
1
解决办法
542
查看次数

deque.popleft()和list.pop(0).有性能差异吗?

deque.popleft()并且list.pop(0)似乎返回相同的结果.他们之间有什么性能差异和原因?

python performance cpython list deque

17
推荐指数
3
解决办法
2万
查看次数

编写在CPython,Jython和IronPython中运行的python代码有哪些策略

尝试同时针对其中两个环境我可以安全地说,如果你必须使用数据库等,你最终必须为该环境编写唯一的代码.你有办法处理这种情况吗?

python ironpython jython cpython

16
推荐指数
2
解决办法
1261
查看次数

什么是Python的序列协议?

Python使用魔术方法做了很多,其中大部分是一些协议的一部分.我熟悉"迭代器协议"和"数字协议",但最近偶然发现术语"序列协议".但即使经过一些研究,我也不确定"序列协议"是什么.

例如,C API函数PySequence_Check检查(根据文档)某个对象是否实现了"序列协议".该源代码表明这是一类,这不是一个字典,但实现__getitem__它的方法大致相同,在什么文件iter还指出:

[...]必须支持序列协议(__getitem__()整数参数从0开始的方法).[...]

但是开始的要求0不是"实施"的PySequence_Check.

然后还有的collections.abc.Sequence类型,它基本上是说实例必须实现__reversed__,__contains__,__iter____len__.

但是根据该定义,实现"序列协议"的类不一定是序列,例如序列具有长度的"数据模型"和抽象类garantuee.但是实现__getitem__(传递PySequence_Check)的类在使用时会抛出异常len(an_instance_of_that_class).

有人可以告诉我序列和序列协议之间的区别(如果除了阅读源代码之外还有协议的定义)以及何时使用哪个定义?

python cpython sequence python-internals

16
推荐指数
1
解决办法
1620
查看次数

为什么Python总是不需要关键字空格?

为什么在关键词之前和之后有时会省略空格?例如,为什么表达式2if-1e1else 1有效?

似乎在CPython 2.7和3.3中都有效:

$ python2
Python 2.7.3 (default, Nov 12 2012, 09:50:25) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 2if-1e1else 1
2

$ python3
Python 3.3.0 (default, Nov 12 2012, 10:01:55) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 2if-1e1else 1
2
Run Code Online (Sandbox Code Playgroud)

甚至在PyPy中:

$ pypy
Python 2.7.2 (341e1e3821ff, Jun 07 2012, 15:42:54)
[PyPy 1.9.0 …
Run Code Online (Sandbox Code Playgroud)

python pypy cpython

15
推荐指数
1
解决办法
249
查看次数

CPython内存分配

这篇文章的灵感来自于关于如何在CPython中为对象分配内存的评论.原来,这是创建一个列表,并追加到它在一个for循环的环境相一相的列表理解.

所以这是我的问题:

  1. CPython中有多少个不同的分配器?
    • 每个人的功能是什么?
  2. 什么时候被malloc称为?(malloc根据本评论中的内容,列表理解可能不会导致调用
  3. python在启动时为自己分配了多少内存?
    1. 是否有规则管理哪些数据结构在此内存中获得第一个"dibs"?
  4. 对象在被删除时使用的内存会发生什么变化(python仍然保留在内存中以便将来分配给另一个对象,或者GC是否为另一个进程释放内存,比如Google Chrome,要使用) ?
  5. 何时触发GC?
  6. lists是动态数组,这意味着它们需要一块连续的内存.这意味着如果我尝试将对象附加到列表中,其底层C数据结构数组无法扩展,则将数组复制到内存的不同部分,其中可以使用更大的连续块.那么当我初始化列表时,为这个数组分配了多少空间?
    • 为新数组分配了多少额外空间,现在它包含旧列表和附加对象?

编辑:从评论中,我认为这里有太多问题.我这样做只是因为这些问题都非常相关.不过,如果是这样的话,我很乐意把它分成几个帖子(请在评论中告诉我这样做)

python memory-management cpython

15
推荐指数
1
解决办法
2080
查看次数

Boost.python与Cython for C++/python接口

我知道这已被问了一千次,但是我需要选择一个可以将C++函数和方法暴露给python的库.

考虑到我的应用程序,主要是科学(矩阵)库,以及python生成器的成熟度,支持可用性和性能,我遇到了两个选项:

  • 用Cython
  • Boost.Python的

我已经消除了(出于好的或坏的原因)其他选项,如SWIG,SIP,Pybindgen,......

关于那2个图书馆的任何建议?任何具有杀手功能的东西?

我的项目有名称空间,嵌套类,回调等.

谢谢

c++ python binding cpython boost-python

15
推荐指数
1
解决办法
4040
查看次数

在Jython中使用NumPy和Cpython

必须使用商业Java库,并希望从Python中完成.Jython很强大,我很好,因为它背后有一些点发布.但是,我也想使用NumPy,这显然不适用于Jython.CPype和Java数字库之类的选项没有吸引力.前者基本上死了.后者大多不成熟,缺乏易用性和广泛接受NumPy.我的问题是:如何让Jython和Python代码互操作?我可以接受从Cpython或其他方式调用Jython.

python java numpy jython cpython

14
推荐指数
2
解决办法
2万
查看次数