众所周知,Python编程言语的咒语之一就是,“有且只要一种办法到达意图。”(在你的Python交互指令行运用“import this”来查看完好列表。)可是,通常许多时分,你有许多的办法选择来到达意图。在这种情况下,咱们无法显着看出哪种办法是最好的。
我的一个学生近来通过电子邮件问我,哪种是Python中衔接字符串最有用的办法。
测验成果出乎我的预料 - 这给了我一个机会来告诉她(及别的人)怎么测验这么的工作。我底子不是一个基准测验专家,但我以为,我的发现能够深入了解Python字符串衔接。
想要一起学习交流想要共同进步的可以加python爬虫学习群399288541,群里有许多学习资料等待着大家
首要,让咱们回想一下Python为咱们供给了这几种办法来衔接字符串。咱们能够用+运算符,例如:
>> "ABC" + "DEF"
"ABCDEF"
咱们也能够用%运算符,它能够做的不只是衔接,但仍然是一个合理的选项:
>>> “%S%S” %( "ABC", "DEF")
"ABCDEF"
正如我在曾经的博客文章现已说到,咱们也有一个更现代的办法做到这一点,那就是str.format办法:
>>> "{0} {1}".format(X, Y)
"ABCDEF"
正如%操作符,str.format办法远比简略的衔接更强壮。但我想,这会让我深入了解相对速度。
如今,咱们怎么计时呢?在Jupyter(又名IPython中),咱们能够运用奇特的“timeit”指令来运转代码。因而,我写了四大功用,其间每个都以不同的办法衔接字符串。我成心运用全局变量(命名为“X”和“Y”),以包括初始字符串,和一个局部变量“Z”,来存放成果。成果随后由函数返回。(咱们能够略微铺开一点“X”和“Y”的值和界说。)
想要一起学习交流想要共同进步的可以加python爬虫学习群399288541,群里有许多学习资料等待
我要指出,concat3和concat4几乎是相同的,由于它们都运用str.format办法。第一个运用参数的隐式方位,而第二个运用显式的方位。我决定,已然我已在做基准字符串衔接测验,我不妨也看看当给出参数的索引时是不是有任何速度区别。
然后我界说了两个全局变量:
X = "ABC"
Y = "DEF"
终究,我运转每个函数并计时:
%timeit concat1()
%timeit concat2()
%timeit concat3()
%timeit concat4()
成果如下:
concat1:153ns/loop
concat1:275ns/loop
concat1:398ns/loop
concat1:393ns/loop
从这个基准测验中,咱们能够看到,concat1,它选用+,比任何别的的办法显着更快。这有点遗憾,由于我是多么爱用str.format - 但它也意味着,假如我做一大堆的字符串处理,我应当坚持+,这也许包括更少的功用,但远快于别的办法。
疑问是,上述基准测验也许是有点疑问的,由于咱们运用短字符串。在Python中十分短的字符串是“被束缚的”,这意味着它们被界说一次,然后保存在一个表中,这么他们不需要再次进行分配,偏重新创立。究竟,由于字符串是不可变的,为何咱们不止一次创立“ABC”呢?咱们能够只引证创立的第一个“ABC”。
这也许会搞乱咱们的基准测验。可是,试着检查更大的字符串也极好。走运的是,咱们运用全局变量 - 因而,通过改动这些全局变量的界说,咱们能够运转咱们的基准测验,并保证没有发生束缚:
X = "ABC" * 10000
y = "DEF" * 10000
如今,当咱们再次测验函数,这时咱们得到:
concat1:2.64μs/loop
concat2:3.09μs/loop
concat3:3.33μs/loop
concat4:3.48μs/loop
每个循环所花的时刻许多 - 但咱们看到,咱们的+操作符仍然是最快的。尽管不同没有那么无穷,可是依然是相当显着和显着。
那么假如咱们不再运用全局变量,而是在函数中指定字符串呢?会有所不同吗?几乎能够肯定不是,但值得迅速测验一下:
想要一起学习交流想要共同进步的可以加python爬虫学习群399288541,群里有许多学习资料等待
而咱们终究的成果是:
concat1:4.89μs/loop
concat2:5.78μs/loop
concat3:6.22μs/loop
concat4:6.19μs/loop
再一次,咱们看到,+操作符是最大赢家,但它的优势没有操作短字符串时那么显着了。 str.format办法显着缩短。咱们能够看到,关于str.format办法来说,不管运用“{0} {1}”仍是“{} {}”格局,基本上没有区别。
通过考虑,这家常便饭。究竟,+是一个十分简略的操作,而%和str.format做得更多。此外,str.format是一种办法,这意味着它将会有更大的开支。
如今,我也能够多跑几个测验 - 例如,有两个以上的字符串。但我以为,这标明至标明必定程度+是Python实现字符串衔接的最快办法。此外,它标明咱们能够迅速,轻松且容易地做基准测验,进行各种实验,以便协助咱们了解啥是Python中的最好实践。
想要一起学习交流想要共同进步的可以加python爬虫学习群399288541,群里有许多学习资料等待着大家