标签: python-internals

与Python 3.4相比,为什么Python 3.5中的str.translate要快得多?

我试图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))
Run Code Online (Sandbox Code Playgroud)

它按预期工作.但是,在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)"
Run Code Online (Sandbox Code Playgroud)

Python 3.4程序需要1.3毫秒,而Python 3.5中的相同程序只需要26.4μs.

与Python 3.4相比,Python 3.5有哪些改进使其更快?

python string python-3.x python-internals python-3.5

116
推荐指数
1
解决办法
1万
查看次数

查找内置Python函数的源代码?

有没有办法看到内置函数如何在python中工作?我不是指如何使用它们,而是它们是如何构建的,排序枚举背后的代码是什么......?

python python-internals

114
推荐指数
8
解决办法
9万
查看次数

Python是否优化了仅用作返回值的变量?

以下两个代码片段之间是否存在任何最终差异?第一个为函数中的变量赋值,然后返回该变量.第二个函数只是直接返回值.

Python会将它们转换为等效的字节码吗?其中一个更快吗?

案例1:

def func():
    a = 42
    return a
Run Code Online (Sandbox Code Playgroud)

案例2:

def func():
    return 42
Run Code Online (Sandbox Code Playgroud)

python interpreter python-internals

105
推荐指数
1
解决办法
6198
查看次数

为什么元组在内存中占用的空间少于列表?

一个tuple发生在Python的内存空间少:

>>> a = (1,2,3)
>>> a.__sizeof__()
48
Run Code Online (Sandbox Code Playgroud)

lists需要更多的内存空间:

>>> b = [1,2,3]
>>> b.__sizeof__()
64
Run Code Online (Sandbox Code Playgroud)

Python内存管理内部会发生什么?

python tuples list python-2.7 python-internals

102
推荐指数
3
解决办法
1万
查看次数

我们能让 1 == 2 成立吗?

Pythonint是封装实际数值的对象。我们可以修改这个值吗,例如将对象的值设置1为 2?那么这就1 == 2变成了True

python cpython python-internals

101
推荐指数
3
解决办法
8373
查看次数

Python中的hash(n)== n是什么时候?

我一直在玩Python的哈希函数.对于小整数,它hash(n) == n总是出现.然而,这并没有扩展到大数:

>>> hash(2**100) == 2**100
False
Run Code Online (Sandbox Code Playgroud)

我并不感到惊讶,我理解哈希需要一个有限范围的值.这个范围是多少?

我尝试使用二进制搜索来找到最小的数字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` for all :math:`n \ge 0`, return None.

>>> f = lambda n: int(hash(n) != n)
>>> n = codejamhelpers.binary_search(f, 0)
>>> hash(n)
2305843009213693950 …
Run Code Online (Sandbox Code Playgroud)

python hash python-2.7 python-3.x python-internals

98
推荐指数
3
解决办法
6089
查看次数

97
推荐指数
1
解决办法
9521
查看次数

关于Python内置的sort()方法

sort()Python使用的内置方法是什么算法?是否可以查看该方法的代码?

python sorting algorithm python-internals

94
推荐指数
3
解决办法
5万
查看次数

为什么max比sort更慢?

我发现它maxsortPython 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
Run Code Online (Sandbox Code Playgroud)

Python 3

$ python3 -m timeit -s 'import random;a=list(range(10000));random.shuffle(a)' 'a.sort();a[-1]'
1000 loops, best of 3: 252 usec per loop
$ python3 -m timeit -s 'import random;a=list(range(10000));random.shuffle(a)' 'max(a)'
1000 loops, best of 3: 371 usec per loop
Run Code Online (Sandbox Code Playgroud)

为什么是 …

python sorting max python-internals

91
推荐指数
3
解决办法
9517
查看次数

为什么复制洗牌列表要慢得多?

复制洗牌range(10**6)清单十次需要大约0.18秒:(这是五次运行)

0.175597017661
0.173731403198
0.178601711594
0.180330912952
0.180811964451
Run Code Online (Sandbox Code Playgroud)

将未洗牌的列表复制十次需要大约0.05秒:

0.058402235973
0.0505464636856
0.0509734306934
0.0526022752744
0.0513324916184
Run Code Online (Sandbox Code Playgroud)

这是我的测试代码:

from timeit import timeit
import random

a = range(10**6)
random.shuffle(a)    # Remove this for the second test.
a = list(a)          # Just an attempt to "normalize" the list.
for _ in range(5):
    print timeit(lambda: list(a), number=10)
Run Code Online (Sandbox Code Playgroud)

我也尝试过复制a[:],结果相似(即速度差异很大)

为什么速度差异很大?我知道并理解着名的速度差异为什么处理排序数组比未排序数组更快?例如,但在这里我的处理没有决定.它只是盲目地复制列表中的引用,不是吗?

我在Windows 10上使用Python 2.7.12.

编辑:现在尝试使用Python 3.5.2,结果几乎相同(在0.17秒内一直洗牌,在0.05秒内一直未洗牌).这是代码:

a = list(range(10**6))
random.shuffle(a)
a = list(a)
for _ in range(5):
    print(timeit(lambda: list(a), number=10))
Run Code Online (Sandbox Code Playgroud)

python python-internals

87
推荐指数
3
解决办法
7015
查看次数