打印格式?哪一个更好python

时间:2012-09-13 21:54:17

标签: python

我一直很好奇

为什么python有不同的打印方式?

例如

print "this is ",a," and " ,b

VS

print "this is %d and %d" %(a,b)

任何性能问题?和东西?

5 个答案:

答案 0 :(得分:5)

还有很多方法可以打印东西"在Python中也是如此,包括更现代的str.format()方法,sys.stdout.write('foo'),以及其他可能的方法。

print a, b, c%格式之间的差异而言,我通常使用前者主要用于调试输出,当你只需要一堆变量之间的空格时。当我想要格式化格式或对格式的更多控制时,我使用%(实际上,这些天我总是使用str.format)。

例如:

print 'DEBUG:', var1, var2

对战:

print 'Benchmarks took {0:.3f}s to run'.format(seconds)

此外,%str.format格式更加通用 - 它们实际上不打印任何内容,它们返回一个字符串,您可以打印,写入文件,存储数据库,作为Web响应发送等

关于表现 - 不用担心。这三者几乎肯定是快速的,过早的优化是所有邪恶的根源。

我不想发布数字(因为这可能会鼓励错误的心态),但timeit使用起来非常简单,我无法帮助自己。

C:\>python -m timeit -s "import cStringIO; s = cStringIO.StringIO()"
                     "print >>s, 'this is', 'a', 'test'"
100000 loops, best of 3: 3.39 usec per loop

c:\>python -m timeit -s "import cStringIO; s = cStringIO.StringIO()"
                     "print >>s, 'this is %s test' % 'a'"
1000000 loops, best of 3: 1.32 usec per loop

C:\>python -m timeit -s "import cStringIO; s = cStringIO.StringIO()"
                     "print >>s, 'this is {0} test'.format('a')"
1000000 loops, best of 3: 1.64 usec per loop

我不太清楚为什么print a, b, c方法明显变慢,可能是一个实现细节。但是,不要担心 - 打印到文件或屏幕所需的时间可能远远超过字符串格式化部分。

答案 1 :(得分:3)

第二种方法可以更好地格式化您的打印​​参数。例如,您可以指定将数字格式化为十六进制,或指定要显示浮点数的小数位数。

答案 2 :(得分:1)

两者基本相同。 Python提供格式化选项,以避免在复杂字符串中使用重复的逗号,这对于类型和读取都会变得乏味。有时一个人会更好地适应特定的情况,有时会另一个人。

答案 3 :(得分:0)

在性能问题上也是如此 - 不是在时间上而是在太空中。

这些陈述是平等的:

print "this is ",a," and " ,b
sys.stdout.write("this is ");sys.stdout.write(" ");sys.stdout.write(str(a));sys.stdout.write(" ");sys.stdout.write(" and ");sys.stdout.write(str(b));sys.stdout.write("\n");

那些是平等的:

print "this is %d and %d" %(a,b)
sys.stdout.write("this is %d and %d" %(a,b));sys.stdout.write("\n")

通常,如果您打印许多元素,则第一个版本被认为更快,因为一个接一个地写入流中。

第二个版本需要处理和复制字符串"this is %d and %d"的部分内容。因此,如果你有很多元素并且你格式化很多次并且字符串很大,那么它可以占用比版本1更多的内存。

但是因为Python水平相当高,所以我不能肯定地说什么更好。

答案 4 :(得分:0)

在我们讨论打印方式时,我想对logging模块大声喊出来。

import logging
# call once per process
logging.basicConfig(level=logging.INFO)

# do this when you would print
logging.info('this is %d and %d', a, b)

就像打印一样简单,但很容易配置为按日期,自定义格式等自动轮换记录到文件,当你突然意识到“哦,这个项目就在这里。”