3

我一直很好奇

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

例如

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

对比

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

有性能问题吗?和东西?

4

5 回答 5

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方法明显慢,可能是实现细节。但是,不要担心——打印到文件或屏幕所需的时间可能远远超过字符串格式化部分。

于 2012-09-13T22:00:26.520 回答
3

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

于 2012-09-13T22:00:11.890 回答
1

两者本质上是一样的。Python 提供了格式化选项,以避免在复杂的字符串中使用重复的逗号,这对于输入和阅读来说都会变得乏味。有时一个会更适合特定情况,有时另一个会。

于 2012-09-13T21:58:37.627 回答
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 是相当高级的,所以我不能确定哪个性能更好。

于 2012-09-13T22:01:11.757 回答
0

在我们讨论打印内容的方法时,我只想对日志记录模块大喊一声。

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)

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

于 2012-09-14T04:19:40.080 回答