我一直很好奇
为什么 python 有不同的打印方式?
例如
print "this is ",a," and " ,b
对比
print "this is %d and %d" %(a,b)
有性能问题吗?和东西?
我一直很好奇
为什么 python 有不同的打印方式?
例如
print "this is ",a," and " ,b
对比
print "this is %d and %d" %(a,b)
有性能问题吗?和东西?
在 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
方法明显慢,可能是实现细节。但是,不要担心——打印到文件或屏幕所需的时间可能远远超过字符串格式化部分。
第二种方法可以更好地格式化打印的参数。例如,您可以指定将数字格式化为十六进制,或指定浮点数要显示的小数位数。
两者本质上是一样的。Python 提供了格式化选项,以避免在复杂的字符串中使用重复的逗号,这对于输入和阅读来说都会变得乏味。有时一个会更适合特定情况,有时另一个会。
它在性能问题上很友好——不是在时间上,而是在空间上。
这些陈述是相等的:
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 是相当高级的,所以我不能确定哪个性能更好。
在我们讨论打印内容的方法时,我只想对日志记录模块大喊一声。
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)
当你突然意识到“哦,这个项目就在这里”时,就像打印一样简单,但非常容易配置以按日期自动旋转、自定义格式等记录到文件。