首先我检查了 % 与反引号。 % 是比较快的。然后我检查了%(元组)与'string'.format()。一个最初的错误让我觉得它更快。但不是。 % 更快。
因此,您已经以 Python 中最快的方式进行了大量的浮点到字符串转换。
下面的演示代码是丑陋的演示代码。请不要教我 xrange 与 range 或其他迂腐。 KThxBye。
我的临时且高度不科学的测试表明,Linux 上 Python 2.5 上的 (a) % (1.234,) 操作比 linux 上 Python 2.6 上的 % (1.234,...) 操作快,对于下面的测试代码,附带条件是尝试使用 'string'.format() 在 2.6 之前的 python 版本上不起作用。以此类推。
# this code should never be used in production.
# should work on linux and windows now.
import random
import timeit
import os
import tempfile
start = 0
interval = 0.1
amap = [] # list of lists
tmap = [] # list of tuples
def r():
return random.random()*500
for i in xrange(0,10000):
amap.append ( [r(),r(),r(),r(),r(),r()] )
for i in xrange(0,10000):
tmap.append ( (r(),r(),r(),r(),r(),r()) )
def testme_percent():
log_file = tempfile.TemporaryFile()
try:
for qmap in amap:
s = '%g %g %g %g %g %g \n' % (qmap[0], qmap[1], qmap[2], qmap[3], qmap[4], qmap[5])
log_file.write( s)
finally:
log_file.close();
def testme_tuple_percent():
log_file = tempfile.TemporaryFile()
try:
for qtup in tmap:
s = '%g %g %g %g %g %g \n' % qtup
log_file.write( s );
finally:
log_file.close();
def testme_backquotes_rule_yeah_baby():
log_file = tempfile.TemporaryFile()
try:
for qmap in amap:
s = `qmap`+'\n'
log_file.write( s );
finally:
log_file.close();
def testme_the_new_way_to_format():
log_file = tempfile.TemporaryFile()
try:
for qmap in amap:
s = '{0} {1} {2} {3} {4} {5} \n'.format(qmap[0], qmap[1], qmap[2], qmap[3], qmap[4], qmap[5])
log_file.write( s );
finally:
log_file.close();
# python 2.5 helper
default_number = 50
def _xtimeit(stmt="pass", timer=timeit.default_timer,
number=default_number):
"""quick and dirty"""
if stmt<>"pass":
stmtcall = stmt+"()"
ssetup = "from __main__ import "+stmt
else:
stmtcall = stmt
ssetup = "pass"
t = timeit.Timer(stmtcall,setup=ssetup)
try:
return t.timeit(number)
except:
t.print_exc()
# no formatting operation in testme2
print "now timing variations on a theme"
#times = []
#for i in range(0,10):
n0 = _xtimeit( "pass",number=50)
print "pass = ",n0
n1 = _xtimeit( "testme_percent",number=50);
print "old style % formatting=",n1
n2 = _xtimeit( "testme_tuple_percent",number=50);
print "old style % formatting with tuples=",n2
n3 = _xtimeit( "testme_backquotes_rule_yeah_baby",number=50);
print "backquotes=",n3
n4 = _xtimeit( "testme_the_new_way_to_format",number=50);
print "new str.format conversion=",n4
# times.append( n);
print "done"
我认为您可以通过在其他地方构建浮动元组来优化您的代码,无论您在何处构建该地图,首先构建您的元组列表,然后以这种方式应用 fmt_string % 元组:
for tup in mytups:
log_file.write( fmt_str % tup )
通过从 for 循环中删除 make-a-tuple 部分,我能够将 8.7 秒缩短到 8.5 秒。这并不多。大男孩有浮点格式,我相信它总是会很昂贵。
替代方案:
您是否考虑过不要将如此庞大的日志作为文本编写,而是使用可用的最快“持久性”方法保存它们,然后在需要时编写一个简短的实用程序将它们转储为文本?有些人使用 NumPy 处理非常大的数字数据集,他们似乎不会使用逐行转储来存储他们的东西。见:
http://thsant.blogspot.com/2007/11/saving-numpy-arrays-which-is-fastest.html