在python 3中输入和打印

时间:2015-06-23 09:52:42

标签: python python-2.7 python-3.x time-complexity

我们知道在Python 3中已弃用print语句,但我们也知道print()函数在两者中都存在。其中哪一个更快,贬值在功能方面有何帮助?

input()函数存在同样的问题,raw_input的弃用如何帮助确定Python 2和Python 3中input()的速度?

编辑:分别基于iPython和iPython3进行比较。

这是iPython。

In [1]: %%time
   ...: print("Hello World!")
   ...: 
Hello World!
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 16.2 µs

这是iPython3。

In [1]: %%time
   ...: print("Hello World!")
   ...: 
Hello World!
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 61 µs

Python3似乎更慢!

4 个答案:

答案 0 :(得分:4)

使print()成为一个功能更多的是提供便利。

  1. 如果print()是一个函数,则可以通过执行def print(...)或从其他位置导入新函数来替换函数。

  2. 你可以这样做:

    [print(i) for i in range(10)] # seems a bit impractical, though
    

    f = lambda x: print(x)
    

    您无法使用print语句执行此操作。

  3. print()函数如下所示:

    def print(*args, sep=' ', end='\n', file=None)
        ...
    
    • args:将打印出值的位置参数。
    • sep:分隔符,将在参数之间打印。
    • end:结束文本,将在输出所有参数后打印。
    • file:将向其发送输出的文件对象。

    所以你可以做到

    print(*['a', 'b', 'c', 'd'], sep=", ", end="\nAll values printed")
    # outputs ->
    a, b, c, d
    All values printed
    

    但您无法对print语句执行相同的操作。是的,您可以编写一些代码来执行函数正在执行的操作,但就像我说的那样,print()函数比它的语句更方便。

答案 1 :(得分:1)

Python 3使print成为函数,而不是语句;调用函数总会增加一些开销。使用dis查看两个版本中生成的字节码可以支持这一点:

<强>脚本

def print_item(item):
    print(item)

if __name__ == '__main__':
    import dis
    dis.dis(print_item)

<强> 2.7.10

  2           0 LOAD_FAST                0 (item)
              3 PRINT_ITEM          
              4 PRINT_NEWLINE       
              5 LOAD_CONST               0 (None)
              8 RETURN_VALUE        

<强> 3.4.3

  2           0 LOAD_GLOBAL              0 (print)
              3 LOAD_FAST                0 (item)
              6 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
              9 POP_TOP
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE

然而,在两个版本中使用timeit进行了超过1,000次迭代,我实际上在2.x(2.46秒对2.30秒)中看到了稍慢的性能。在实践中,这是无关紧要的,因为当性能至关重要时你根本不print

请注意,您可以使用from __future__ import print_function在2.x中进行3.x样式打印。有关print成为函数的原因的详细信息,请参阅PEP-3105

你还提到input - 2.x和3.x中的实现之间的任何性能差异都是完全不相关,因为等待一些笨重的meatsack键入其字符和点击输入将比将其作为字符串传递给您的代码花费的时间多数量级。话虽如此,您可以再次使用dis来证明2.x中的raw_input和3.x中的input生成相同的字节码。

答案 2 :(得分:1)

在Python 2中,

%timeit print 'foo' 

仅比

快得多(8.97 vs 9.06 us)
from __future__ import print_statement
%timeit print('foo')

在Python 3中,那个时间达到了11 us,这使得Python 3比Python 2慢了不到20%。这似乎与人们在运行整个PyStone时找到here的结果一致基准套件。

TLDR:Python 3比Python 2慢 - 与print语句成为函数无关

答案 3 :(得分:0)

I see a lot of answers about print .

About input() / raw_input() function in python 2.x and python 3.x .

In python 2.x , input() is slightly different from raw_input()

  1. input() - this function in python 2.x actually evaluates the input and then returns it . An example -

    >>> input('Hello : ')
    Hello : 2<3
    True
    
  2. raw_input() - Whereas raw_input() does not evaluate the input and rather provides the input as a string. An example -

    >>> raw_input('Hello : ')
    Hello : 2<3
    '2<3'
    

In python 3.x , the raw_input() function was renamed to input() , I am guessing they felt that there was no need for an input() function that provides the result after evaluating it (I never saw a use for it either , wonder if anyone did really use it)