- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想知道为什么 repr(int)
比 str(int)
快。使用以下代码片段:
ROUNDS = 10000
def concat_strings_str():
return ''.join(map(str, range(ROUNDS)))
def concat_strings_repr():
return ''.join(map(repr, range(ROUNDS)))
%timeit concat_strings_str()
%timeit concat_strings_repr()
我得到了这些时间(python 3.5.2,但结果与 2.7.12 非常相似):
1.9 ms ± 17.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1.38 ms ± 9.07 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
如果我在正确的道路上,the same function long_to_decimal_string
is getting called引擎盖下。
我是不是做错了什么或者我错过了什么?
更新:这可能与 int
的 __repr__
或 __str__
方法无关,但与 repr()
和str()
,因为 int.__str__
和 int.__repr__
实际上相当快:
def concat_strings_str():
return ''.join([one.__str__() for one in range(ROUNDS)])
def concat_strings_repr():
return ''.join([one.__repr__() for one in range(ROUNDS)])
%timeit concat_strings_str()
%timeit concat_strings_repr()
结果:
2.02 ms ± 24.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
2.05 ms ± 7.07 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
最佳答案
因为使用 str(obj)
必须首先经过 type.__call__
然后 str.__new__
(create a new string) 然后 PyObject_Str
(make a string out of the object) 调用 int.__str__
并且,最后,使用你链接的函数。
repr(obj)
,对应builtin_repr
,直接调用PyObject_Repr
(get the object repr),int.__repr__
再调用与int.__str__
功能相同的call_function
.
此外,它们通过 CALL_FUNCTION
opcode(处理为调用生成的 _PyObject_FastCallKeywords
的函数)所采用的路径略有不同。
来自 GitHub 上的 master 分支(CPython 3.7):
str
穿过 _PyStack_AsTuple
(即调用 type.__call__
的那个)。除了执行更多检查之外,这还需要创建一个元组来保存位置参数(参见 _PyCFunction_FastCallKeywords
)。 repr
通过调用 _PyMethodDef_RawFastCallKeywords
的 indexing of the args 。 repr
也很幸运,因为它只接受一个参数(开关将其引导至 _PyMethodDef_RawFastCallKeywords
中的 METH_0
案例),因此无需创建一个元组,只是 ojit_a 。 正如您的更新所述,这与 int.__repr__
与 int.__str__
无关,毕竟它们是相同的功能;这都是关于 repr
和 str
如何到达他们的。 str
只需要更加努力。
关于python - 为什么 repr(int) 比 str(int) 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45376719/
在交互式 Python 提示符上,当我没有将表达式 foo 的输出绑定(bind)到名称时,Python 将写入 builtins.repr(foo) 的输出> 到终端。 在较新版本的 Python
我目前正在编写一个 Vulkan 渲染器,我刚刚意识到我应该只接受 repr(C) 类型,但据我所知,没有办法在编译时实际检查它。 struct Vertex { x: f32, y:
是否有等效的 Pythons repr Scala 中的函数? 即一个函数,你可以给任何 scala 对象,它会产生一个有效的 scala 代码的对象的字符串表示。 例如: val l = List(
需要字符串在打印输出中显示 \n,且不带尾随 + 前导 '。目前在输入上使用repr(打开+读取.txt),所以我想知道删除'以进行正确索引/搜索的最佳方法是什么? repr('s')[1:-1] r
我想使用 repr() 获取 Python 编码的字符串文字(我可以将其粘贴到某些源代码中),但我更喜欢带有真正换行符的三引号字符串比 \n 转义序列。 我可以对字符串进行后处理,将 \n 转换回换行
我正在用 Python 处理一些文本解析,为此,对我要解析的每个字符串应用 repr() 函数对我来说很好,但在解析之后,我需要将一些已解析的子字符串转换回来到以前的表示,因为我想打印它们但我无法做到
所以我有一门类(class),我设置了类似的内容 class Piece: def __init__(): self.txt = "\u2665" # some met
作为Python 2 documentation on __repr__ 状态: If at all possible, this (i.e. __repr__) should look like a
我一直在阅读 repr在 Python 中。我想知道 repr 输出的应用程序是什么是。例如 class A: pass repr(A) ='' b=A() repr(b) = '' 什么时候会对
我正在使用一个小的 Python 脚本来生成一些将在 C 头文件中使用的二进制数据。 此数据应声明为 char[],如果可以将其编码为字符串(当它们不在 ASCII 可打印范围内时使用相关的转义序列)
在python中,repr和反引号`(1的左边)有区别吗? 用于演示: class A(object): def __repr__(self): return 'repr A'
我有一个节点类以十六进制和 HSV 形式保存 RGB 数据。我将使用它以各种方式对颜色进行排序,并且希望 HSV 元组保持浮点形式以进行比较,而不是每次使用都从字符串转换。有没有一种方法可以指定数据类
a = b'\x00\x01' ra = repr(a) # ra == "b'\\x00\\x01'" assert invert_repr(ra) == a invert_repr 的正确形式
我需要一个结构被视为 16 个无符号整数的数组,并且传递 CreditCard 类型将是透明的,因为我将传递一个 16 个无符号整数的数组。 如何使这段代码按照设计的方式工作? use std::fm
我有这个 C 代码: typedef void (*f_t)(int a); struct Foo { f_t f; }; extern void f(struct Foo *); b
我有一个结构: struct A { names: Vec, } 还有另一个结构: #[repr(C)] struct B { pub a: A, } 这是否使 A 也具有 repr(
除最后一部分外,我的代码运行完美。我想用 repr 函数重新创建对象,但它显然不起作用。我在这里和网上都试过了,但我还是很困惑。有什么方法可以做到吗?如果可以,语法是什么? class Modulo(
这个问题在这里已经有了答案: Convert "\x" escaped string into readable string in python (4 个答案) 关闭 7 个月前。 我有这个 st
我想要一种简单的方法来获取 repr() 之类的字典字符串按键排序。 my_print(dict(a=1, b=2, c=3)) -> "{'a': 1, 'b': 2, 'c': 3}" 我的解决方
我正在尝试在 Java 中完全模拟 Python 的 repr;这包括尽可能使用单引号。 Python 使用什么方法来确定它应该发出哪种引号? 编辑:我正在寻找一些实际代码,位于 Python 网络中
我是一名优秀的程序员,十分优秀!