- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
使用 str.strip
可以通过两种方式在空白处进行分割。 。您可以发出不带参数的调用,str.strip()
,默认使用空格分隔符,或者自己使用 str.strip(' ')< 显式提供参数
。
但是,为什么这些功能在计时时表现如此不同?
使用带有有意空格的示例字符串:
s = " " * 100 + 'a' + " " * 100
s.strip()
和s.strip(' ')
的时序分别为:
%timeit s.strip()
The slowest run took 32.74 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 396 ns per loop
%timeit s.strip(' ')
100000 loops, best of 3: 4.5 µs per loop
strip
需要 396ns
而 strip(' ')
需要 4.5 μs
,类似的场景是rstrip
和 lstrip
条件相同。另外,bytes objects
seem do be affected too .
时间是针对 Python 3.5.2
执行的,而在 Python 2.7.1
上,差异不那么剧烈。 docs on str.strip
不要指出任何有用的东西,所以,为什么会发生这种情况?
最佳答案
这是因为两种不同情况存在两个函数,如 unicode_strip
所示。 ; do_strip
和 _PyUnicodeXStrip
第一个执行比第二个快得多。
功能 do_strip
适用于常见情况 str.strip()
其中不存在参数和 do_argstrip
(包装 _PyUnicode_XStrip
)对于 str.strip(arg)
的情况被调用,即提供参数。
do_argstrip
只检查分隔符是否有效且不等于 None
(在这种情况下它调用 do_strip
)它调用 _PyUnicode_XStrip
.
两者do_strip
和 _PyUnicode_XStrip
遵循相同的逻辑,使用两个计数器,一个等于 0,另一个等于字符串的长度。
使用两个 while
循环,第一个计数器递增,直到达到不等于分隔符的值,第二个计数器递减,直到满足相同的条件。
区别在于检查当前字符是否不等于分隔符的方式。
do_strip
:在最常见的情况下,要拆分的字符串中的字符可以用ascii
表示。存在额外的小幅性能提升。
while (i < len) {
Py_UCS1 ch = data[i];
if (!_Py_ascii_whitespace[ch])
break;
i++;
}
Py_UCS1 ch = data[i];
_Py_ascii_whitespace[ch]
的数组中进行的。 . 所以,简而言之,效率很高。
如果字符不在ascii
范围,差异并没有那么大,但它们确实减慢了整体执行速度:
while (i < len) {
Py_UCS4 ch = PyUnicode_READ(kind, data, i);
if (!Py_UNICODE_ISSPACE(ch))
break;
i++;
}
Py_UCS4 ch = PyUnicode_READ(kind, data, i);
进行访问Py_UNICODE_ISSPACE(ch)
完成。宏(它只是调用另一个宏: Py_ISSPACE
)_PyUnicodeXStrip
:在这种情况下,访问基础数据就像在前一种情况下一样,使用 PyUnicode_Read
完成。 ;另一方面,检查字符是否为空格(或者实际上是我们提供的任何字符)的检查相当复杂。
while (i < len) {
Py_UCS4 ch = PyUnicode_READ(kind, data, i);
if (!BLOOM(sepmask, ch))
break;
if (PyUnicode_FindChar(sepobj, ch, 0, seplen, 1) < 0)
break;
i++;
}
PyUnicode_FindChar
使用,虽然效率很高,但与数组访问相比要复杂得多,速度也慢得多。对于字符串中的每个字符,都会调用它来查看该字符是否包含在我们提供的分隔符中。随着字符串长度的增加,连续调用此函数引入的开销也会增加。
对于那些感兴趣的人,PyUnicode_FindChar
经过相当多的检查,最终会调用 find_char
里面 stringlib
在分隔符长度为 < 10
的情况下将循环直到找到字符。
除此之外,请考虑需要已经调用才能到达此处的其他函数。
至于lstrip
和 rstrip
,情况类似。存在要执行的 strip 化模式的标志,即:RIGHTSTRIP
对于 rstrip
, LEFTSTRIP
对于 lstrip
和 BOTHSTRIP
对于 strip
. do_strip
里面的逻辑和 _PyUnicode_XStrip
根据标志有条件地执行。
关于python - 为什么 str.strip() 比 str.strip (' ' 快得多)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38285654/
你信吗?我有一个这样的循环(请原谅任何错误,我不得不大量编辑大量信息和变量名称,相信我它有效)。 ...旧示例已删除,请参见下面的代码... 如果我将那些中间的 str = "Blah\(odat.c
我正在做一个本地测试来比较 C# 中 String 和 StringBuilder 的 Replace 操作性能,但是对于 String 我使用了以下代码: String str = "String
我想知道为什么str += "A"和 str = str + "A"有不同的表现。 在实践中, string str = "cool" for(int i = 0; i approximately
我有一个类型列表 [("['106.52.116.101']", 1), ("['45.136.108.85']", 1)] 并想将其转换为 [('106.52.116.101', 1), ('45.
我有一个类型列表 [("['106.52.116.101']", 1), ("['45.136.108.85']", 1)] 并想将其转换为 [('106.52.116.101', 1), ('45.
我正在遍历 HashMap并通过一些本地变量中的模式匹配将值放入其中。 委托(delegate)者 fn lyrics_no_bottles(song_template:&mut String){
如果字符串(短语)中只有元音,它(对我而言)说True;否则说 False。我不明白为什么它总是返回 False,因为 (x >= x) 总是返回 True。我感谢任何人检查此查询的解决方案。 (st
我有代码以某种方式转换字符串引用,例如取第一个字母 trait Tr { fn trim_indent(self) -> Self; } impl Tr for &'a str { f
我正在学习指针,这是我的代码。我定义了一个指向 char(实际上是字符串)的指针 *str 和一个指向 int *a 的指针,它们的定义方式相同。我认为 str 和 a 都应该是一个地址,但是当我试图
为什么我会收到错误消息?我已经正确添加了类型,对吗? Invalid index type "str" for "Union[str, Dict[str, str]]"; expected type
你知道下面两个函数是否等价吗? function validate(str) { return ( ['null','','undefined'].indexOf(str) [v, valida
我正在解决这里的 Dataquest 问题:https://app.dataquest.io/m/293/data-cleaning-basics/5/removing-non-digit-chara
我有一个字符串列表,如下所示: ["A TB", "A-R TB", "B TB", "B-R TB", "C TB", "C-R TB"...] 但字符串的顺序是随机的。我如何编写一个将元素配对的函
我正在尝试将此函数从使用 split 改为使用 str.extract (正则表达式)。 def bull_lev(x): spl = x.rsplit(None, 2)[-2].strip(
给定这样的数据结构: [{'a':1, 'b': 2}, {'c':3 }, {'a':4, 'c':9}, {'d':0}, {'d': 0, 'b':6}] 目标是解析数据以产生: {'a': 2
给定这样的数据结构: [{'a':1, 'b': 2}, {'c':3 }, {'a':4, 'c':9}, {'d':0}, {'d': 0, 'b':6}] 目标是解析数据以产生: {'a': 2
s = 'someString' s = QTreeWidgetItem(s) print(s.text(0)) # 0 being 'column' 输出: 's' 如果我对另一
黑白有什么区别: function(char* str ) function(char* str[] ) function(char str[] ) 它们是如何被调用的(通过什么类型的string/c
我试过谷歌搜索但找不到准确的答案,所以请允许我尝试在这里提问。如果问题看起来不合适,请告诉我,我会删除它。 在 JS 中,您可以通过三种不同的方式编写特定的内置功能: 字符串长度 str.toStri
我有这段代码(我的 strlen 函数) size_t slen(const char *str) { size_t len = 0; while (*str) {
我是一名优秀的程序员,十分优秀!