Python 为字符串的长度创建变量是否更快?

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") 但是对于每一次迭代,它都会得到字符串的长度,即使它已被扣除 我制作了另一个版本

我在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")

但是对于每一次迭代,它都会得到字符串的长度,即使它已被扣除

我制作了另一个版本

# 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的答案所示,后者确实稍慢