Python 为字符串的长度创建变量是否更快?
我在Python 2.7中实现了一个Python 为字符串的长度创建变量是否更快?,python,string,python-2.7,reverse,Python,String,Python 2.7,Reverse,我在Python 2.7中实现了一个reverse(s)函数,我编写了如下代码: # iterative version 1 def reverse(s): r = "" for c in range(len(s)-1, -1, -1): r += s[c]; return r print reverse("Be sure to drink your Ovaltine") 但是对于每一次迭代,它都会得到字符串的长度,即使它已被扣除 我制作了另一个版本
reverse(s)
函数,我编写了如下代码:
# iterative version 1
def reverse(s):
r = ""
for c in range(len(s)-1, -1, -1):
r += s[c];
return r
print reverse("Be sure to drink your Ovaltine")
但是对于每一次迭代,它都会得到字符串的长度,即使它已被扣除 我制作了另一个版本
# iterative version 2
def reverse(s):
r = ""
l = len(s)-1
for c in range(l, -1, -1):
r += s[c];
return r
print reverse("Be sure to drink your Ovaltine")
此版本会记住字符串的长度,并且不会在每次迭代中都要求它。对于较长的字符串(如长度为1024的字符串),这比第一个版本快,还是根本没有效果?行中
for c in range(len(s)-1, -1, -1):
len
只计算一次,结果(减一)作为参数传递给range
。因此,这两个版本几乎相同——如果有什么区别的话,后者可能(非常)稍微慢一点,因为它创建了一个新名称来分配减法的结果 排队
for c in range(len(s)-1, -1, -1):
In [12]: %timeit reverse("Be sure to drink your Ovaltine")
100000 loops, best of 3: 2.53 µs per loop
In [13]: %timeit reverse1("Be sure to drink your Ovaltine")
100000 loops, best of 3: 2.55 µs per loop
len
只计算一次,结果(减一)作为参数传递给range
。因此,这两个版本几乎相同——如果有什么区别的话,后者可能(非常)稍微慢一点,因为它创建了一个新名称来分配减法的结果
In [12]: %timeit reverse("Be sure to drink your Ovaltine")
100000 loops, best of 3: 2.53 µs per loop
In [13]: %timeit reverse1("Be sure to drink your Ovaltine")
100000 loops, best of 3: 2.55 µs per loop
reverse
是第一种方法,reverse1
是第二种方法
从计时中可以看出,在性能上几乎没有差别
您可以使用Ipython
按照上述语法对代码计时,只需定义函数并使用%timeit
,然后使用函数和任何参数即可
reverse
是第一种方法,reverse1
是第二种方法
从计时中可以看出,在性能上几乎没有差别
您可以使用
Ipython
按照上述语法对代码计时,只需定义函数并使用%timeit
,然后使用函数和任何参数即可。测量它,看看它是否有显著差异。“但对于每一次迭代,它都会得到字符串的长度,即使它已被扣除。”-你为什么这么认为?@juanchopanza你的意思是测量字符串吗?两个版本只调用len
函数一次-没有区别。您可能想到的是,这通常是一个好主意,但不适用于这里。索引表达式(在本例中仅为s[:-1]
)将比其中任何一个都快。测量它,看看它是否有显著差异。“但对于每个迭代,它都会得到字符串的长度,即使它已被扣除。”-你为什么这么认为?@juanchopanza你的意思是测量字符串吗?两个版本只调用len
函数一次-没有区别。您可能想到的是,这通常是一个好主意,但不适用于这里。索引表达式(在本例中仅为s[:-1]
)将比其中任何一个都快。如@Padraic的答案所示,后者确实稍慢,如@Padraic的答案所示,后者确实稍慢