我一直很好奇
为什么python有不同的打印方式?
例如
print "this is ",a," and " ,b
VS
print "this is %d and %d" %(a,b)
任何性能问题?和东西?
答案 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)
就像打印一样简单,但很容易配置为按日期,自定义格式等自动轮换记录到文件,当你突然意识到“哦,这个项目就在这里。”