如果你编译一个像这样的条件表达式,为什么呢?
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 0和if None表现不同?
在为Python创建C扩展时,是否有可能以某种方式将扩展为文档字符串的注释写入扩展的用户?
简短版本:如果s是字符串,则s = s + \'c\'可以就地修改字符串,但t = s + \'c\'不能。但是操作如何s + \'c\'知道它处于哪种场景呢?
长版:
\nt = s + \'c\'需要创建一个单独的字符串,因为程序随后需要旧字符串 ass和新字符串 as t。
s = s + \'c\'如果是唯一的引用,则可以就地修改字符串s,因为程序只想s成为扩展字符串。如果末尾有多余字符的空间,CPython 实际上会执行此优化。
考虑这些重复添加字符的函数:
\ndef 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) deque.popleft()并且list.pop(0)似乎返回相同的结果.他们之间有什么性能差异和原因?
尝试同时针对其中两个环境我可以安全地说,如果你必须使用数据库等,你最终必须为该环境编写唯一的代码.你有办法处理这种情况吗?
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).
有人可以告诉我序列和序列协议之间的区别(如果除了阅读源代码之外还有协议的定义)以及何时使用哪个定义?
为什么在关键词之前和之后有时会省略空格?例如,为什么表达式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) 这篇文章的灵感来自于关于如何在CPython中为对象分配内存的评论.原来,这是创建一个列表,并追加到它在一个for循环的环境相一相的列表理解.
所以这是我的问题:
malloc称为?(malloc根据本评论中的内容,列表理解可能不会导致调用lists是动态数组,这意味着它们需要一块连续的内存.这意味着如果我尝试将对象附加到列表中,其底层C数据结构数组无法扩展,则将数组复制到内存的不同部分,其中可以使用更大的连续块.那么当我初始化列表时,为这个数组分配了多少空间?
编辑:从评论中,我认为这里有太多问题.我这样做只是因为这些问题都非常相关.不过,如果是这样的话,我很乐意把它分成几个帖子(请在评论中告诉我这样做)
我知道这已被问了一千次,但是我需要选择一个可以将C++函数和方法暴露给python的库.
考虑到我的应用程序,主要是科学(矩阵)库,以及python生成器的成熟度,支持可用性和性能,我遇到了两个选项:
我已经消除了(出于好的或坏的原因)其他选项,如SWIG,SIP,Pybindgen,......
关于那2个图书馆的任何建议?任何具有杀手功能的东西?
我的项目有名称空间,嵌套类,回调等.
谢谢
我必须使用商业Java库,并希望从Python中完成.Jython很强大,我很好,因为它背后有一些点发布.但是,我也想使用NumPy,这显然不适用于Jython.CPype和Java数字库之类的选项没有吸引力.前者基本上死了.后者大多不成熟,缺乏易用性和广泛接受NumPy.我的问题是:如何让Jython和Python代码互操作?我可以接受从Cpython或其他方式调用Jython.
cpython ×10
python ×10
jython ×2
performance ×2
binding ×1
boost-python ×1
c++ ×1
deque ×1
internals ×1
ironpython ×1
java ×1
list ×1
numpy ×1
pypy ×1
python-2.7 ×1
sequence ×1