Questions tagged «python-internals»

Python如何在引擎盖下工作?用于与(例如)设计决策以及内部数据结构和使用的算法有关的问题。

4
为什么Python的数组变慢?
我期望array.array比列表更快,因为数组似乎已拆箱。 但是,我得到以下结果: In [1]: import array In [2]: L = list(range(100000000)) In [3]: A = array.array('l', range(100000000)) In [4]: %timeit sum(L) 1 loop, best of 3: 667 ms per loop In [5]: %timeit sum(A) 1 loop, best of 3: 1.41 s per loop In [6]: %timeit sum(L) 1 loop, best …

4
是否可以“破解” Python的打印功能?
注意:此问题仅供参考。我很想知道这样做有多深入到Python内部。 不久之前,在某个问题的内部开始了一个讨论,该问题是关于传递给print语句的字符串是否可以在调用to之后/期间进行修改print。例如,考虑以下功能: def print_something(): print('This cat was scared.') 现在,当print运行时,到终端的输出应显示: This dog was scared. 请注意,单词“ cat”已被单词“ dog”代替。某处某种方式能够修改那些内部缓冲区以更改打印的内容。假设这样做是在未经原始代码作者明确许可的情况下进行的(因此,被黑客/劫持)。 这个评论从智者@abarnert,尤其让我思考: 有两种方法可以做到这一点,但是它们都很丑陋,绝不应该这样做。最丑陋的方法是code用一个带有不同co_consts 列表的对象替换 函数内部的对象。接下来可能是进入C API以访问str的内部缓冲区。[...] 因此,看起来这实际上是可能的。 这是我解决此问题的幼稚方法: >>> import inspect >>> exec(inspect.getsource(print_something).replace('cat', 'dog')) >>> print_something() This dog was scared. 当然,这exec很糟糕,但这并不能真正回答问题,因为在 print调用when / after之后,它实际上并未进行任何修改。 正如@abarnert解释的那样,它将如何进行?



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倍。 >>> from timeit import timeit >>> timeit("[x for x in 'abc']") 2.0691067844831528 >>> timeit("[x for x in ['a', 'b', 'c']]") 1.5286479570345861 导致此情况的较低级别发生了什么?

1
为什么在Python 3.5中str.translate比Python 3.4更快?
我试图使用text.translate()Python 3.4 从给定的字符串中删除不需要的字符。 最小的代码是: import sys s = 'abcde12345@#@$#%$' mapper = dict.fromkeys(i for i in range(sys.maxunicode) if chr(i) in '@#$') print(s.translate(mapper)) 它按预期工作。但是,在Python 3.4和Python 3.5中执行相同的程序会产生很大的不同。 计算时间的代码是 python3 -m timeit -s "import sys;s = 'abcde12345@#@$#%$'*1000 ; mapper = dict.fromkeys(i for i in range(sys.maxunicode) if chr(i) in '@#$'); " "s.translate(mapper)" Python 3.4程序花费1.3毫秒,而Python 3.5中的同一程序仅花费26.4μs。 …




4
什么时候在Python中hash(n)== n?
我一直在玩Python的hash函数。对于小整数,它hash(n) == n总是出现。但是,这不会扩展为大量: >>> hash(2**100) == 2**100 False 我并不感到惊讶,我知道哈希值取值范围有限。这个范围是多少? 我尝试使用二进制搜索来找到最小的数字hash(n) != n >>> import codejamhelpers # pip install codejamhelpers >>> help(codejamhelpers.binary_search) Help on function binary_search in module codejamhelpers.binary_search: binary_search(f, t) Given an increasing function :math:`f`, find the greatest non-negative integer :math:`n` such that :math:`f(n) \le t`. If :math:`f(n) > t` …

7
如何覆盖Python对象的复制/深层复制操作?
我了解复制模块copy与vs 之间的区别deepcopy。我已经使用过copy.copy并且copy.deepcopy在成功之前使用过,但这是我第一次真正地重载__copy__and __deepcopy__方法。我已经用谷歌搜索看去,通过内置的Python模块查找的实例__copy__和__deepcopy__功能(例如sets.py,decimal.py和fractions.py),但我仍然不能100%肯定我明白了它的权利。 这是我的情况: 我有一个配置对象。最初,我将使用一组默认值实例化一个配置对象。此配置将移交给其他多个对象(以确保所有对象都以相同的配置开始)。但是,一旦开始用户交互,每个对象都需要独立地调整其配置,而又不影响彼此的配置(对我来说,我需要对初始配置进行深入复制才能进行处理)。 这是一个示例对象: class ChartConfig(object): def __init__(self): #Drawing properties (Booleans/strings) self.antialiased = None self.plot_style = None self.plot_title = None self.autoscale = None #X axis properties (strings/ints) self.xaxis_title = None self.xaxis_tick_rotation = None self.xaxis_tick_align = None #Y axis properties (strings/ints) self.yaxis_title = None self.yaxis_tick_rotation = None self.yaxis_tick_align = …

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%?

3
为什么max比排序慢?
我发现它max比sortPython 2和3中的函数慢。 Python 2 $ python -m timeit -s 'import random;a=range(10000);random.shuffle(a)' 'a.sort();a[-1]' 1000 loops, best of 3: 239 usec per loop $ python -m timeit -s 'import random;a=range(10000);random.shuffle(a)' 'max(a)' 1000 loops, best of 3: 342 usec per loop Python 3 $ python3 -m timeit -s 'import random;a=list(range(10000));random.shuffle(a)' 'a.sort();a[-1]' 1000 loops, …

2
.pyc文件什么时候刷新?
我知道“ .pyc”文件是纯文本“ .py”文件的编译版本,是在运行时创建的,以使程序运行更快。但是我观察到了一些事情: 修改“ py”文件后,程序行为会更改。这表明“ py”文件已编译或至少经过某种哈希处理或比较时间戳,以便确定是否应重新编译它们。 删除所有“ .pyc”文件(rm *.pyc)后,有时程序行为也会改变。这表明它们不是在更新“ .py”时被编译的。 问题: 他们如何决定何时编译? 有没有办法确保他们在开发过程中进行更严格的检查?

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.