python字符串格式化函数,Python字符串格式化:“%”是否比“format”函数更有效?...

我想通过比较不同的变量在Python中构建一个字符串:使用+连接(称为“plus”)

使用%

使用"".join(list)

使用format函数

使用"{0.}".format(object)

我比较了三种场景带2个变量的字符串

带4个变量的字符串

包含4个变量的字符串,每个变量使用两次

我测量了每一次100万次的手术,平均做了6次以上的测量。我想出了以下时间安排:

zDFk1.png

在每一个场景中,我都得出以下结论连接似乎是最快的方法之一

使用%格式化比使用format函数格式化快得多

我相信format比%(例如在this question)要好得多,而且%几乎被弃用。

因此,我有几个问题:%真的比format快吗?

如果是,为什么?

为什么"{} {}".format(var1, var2)比"{0.attribute1} {0.attribute2}".format(object)更有效?

作为参考,我使用以下代码来测量不同的计时。import time

def timing(f, n, show, *args):

if show: print f.__name__ + ":\t",

r = range(n/10)

t1 = time.clock()

for i in r:

f(*args); f(*args); f(*args); f(*args); f(*args); f(*args); f(*args); f(*args); f(*args); f(*args)

t2 = time.clock()

timing = round(t2-t1, 3)

if show: print timing

return timing

#Class

class values(object):

def __init__(self, a, b, c="", d=""):

self.a = a

self.b = b

self.c = c

self.d = d

def test_plus(a, b):

return a + "-" + b

def test_percent(a, b):

return "%s-%s" % (a, b)

def test_join(a, b):

return ''.join([a, '-', b])

def test_format(a, b):

return "{}-{}".format(a, b)

def test_formatC(val):

return "{0.a}-{0.b}".format(val)

def test_plus_long(a, b, c, d):

return a + "-" + b + "-" + c + "-" + d

def test_percent_long(a, b, c, d):

return "%s-%s-%s-%s" % (a, b, c, d)

def test_join_long(a, b, c, d):

return ''.join([a, '-', b, '-', c, '-', d])

def test_format_long(a, b, c, d):

return "{0}-{1}-{2}-{3}".format(a, b, c, d)

def test_formatC_long(val):

return "{0.a}-{0.b}-{0.c}-{0.d}".format(val)

def test_plus_long2(a, b, c, d):

return a + "-" + b + "-" + c + "-" + d + "-" + a + "-" + b + "-" + c + "-" + d

def test_percent_long2(a, b, c, d):

return "%s-%s-%s-%s-%s-%s-%s-%s" % (a, b, c, d, a, b, c, d)

def test_join_long2(a, b, c, d):

return ''.join([a, '-', b, '-', c, '-', d, '-', a, '-', b, '-', c, '-', d])

def test_format_long2(a, b, c, d):

return "{0}-{1}-{2}-{3}-{0}-{1}-{2}-{3}".format(a, b, c, d)

def test_formatC_long2(val):

return "{0.a}-{0.b}-{0.c}-{0.d}-{0.a}-{0.b}-{0.c}-{0.d}".format(val)

def test_plus_superlong(lst):

string = ""

for i in lst:

string += str(i)

return string

def test_join_superlong(lst):

return "".join([str(i) for i in lst])

def mean(numbers):

return float(sum(numbers)) / max(len(numbers), 1)

nb_times = int(1e6)

n = xrange(5)

lst_numbers = xrange(1000)

from collections import defaultdict

metrics = defaultdict(list)

list_functions = [

test_plus, test_percent, test_join, test_format, test_formatC,

test_plus_long, test_percent_long, test_join_long, test_format_long, test_formatC_long,

test_plus_long2, test_percent_long2, test_join_long2, test_format_long2, test_formatC_long2,

# test_plus_superlong, test_join_superlong,

]

val = values("123", "456", "789", "0ab")

for i in n:

for f in list_functions:

print ".",

name = f.__name__

if "formatC" in name:

t = timing(f, nb_times, False, val)

elif '_long' in name:

t = timing(f, nb_times, False, "123", "456", "789", "0ab")

elif '_superlong' in name:

t = timing(f, nb_times, False, lst_numbers)

else:

t = timing(f, nb_times, False, "123", "456")

metrics[name].append(t)

#Get Average

print "\n===AVERAGE OF TIMINGS==="

for f in list_functions:

name = f.__name__

timings = metrics[name]

print "{:>20}:\t{:0.5f}".format(name, mean(timings))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值