【问题标题】:Which is a better way of writing loops in python between inline loops and c type loops.这是在 python 中在内联循环和 c 类型循环之间编写循环的更好方法。
【发布时间】:2019-01-04 06:21:02
【问题描述】:

我想知道其中哪个更 Pythonic/更高效。

一)

HostName = [item.lstrip().strip('.').encode('ascii') for item in HostName]

B)

for i in range(len(HostName)):
   HostName[i] = HostName[i].lstrip()
   HostName[i] = HostName[i].strip('.')
   HostName[i] = HostName[i].encode('ascii')

【问题讨论】:

  • A 更 Pythonic。至于效率,我怀疑差异是否很大。
  • HostName[i] = HostName[i].lstrip().strip('.').encode('ascii') 会是一个更公平的比较 - 当您不关心中间结果时,当然没有理由做三个单独的作业。
  • 选项 A 更好,更 Pythonic。第一个是使用 python 列表推导。列表推导式并不是处理列表的唯一方法。各种内置函数和 lambda 函数可以用更少的代码行高效地创建和修改列表。以及更pythonic的方式

标签: python loops


【解决方案1】:

这可以通过使用Python Disassemble,dis模块来知道。

import dis

https://docs.python.org/2/library/dis.html

a = "Hello"
def inline(a):
  b = [_ for _ in a]
  return b

def regular(a):
  c = []
  for _ in a:
    c.append(_)
  return c

#

dis.dis(inline)
2           0 LOAD_CONST               1 (<code object <listcomp> at 0x00000292223534B0, file "<stdin>", line 2>)
              2 LOAD_CONST               2 ('f.<locals>.<listcomp>')
              4 MAKE_FUNCTION            0
              6 LOAD_FAST                0 (a)
              8 GET_ITER
             10 CALL_FUNCTION            1
             12 STORE_FAST               1 (b)

  3          14 LOAD_FAST                1 (b)
             16 RETURN_VALUE

#

dis.dis(regular)
  2           0 BUILD_LIST               0
              2 STORE_FAST               1 (c)

  3           4 SETUP_LOOP              22 (to 28)
              6 LOAD_FAST                0 (a)
              8 GET_ITER
        >>   10 FOR_ITER                14 (to 26)
             12 STORE_FAST               2 (x)

  4          14 LOAD_FAST                1 (c)
             16 LOAD_ATTR                0 (append)
             18 LOAD_FAST                2 (x)
             20 CALL_FUNCTION            1
             22 POP_TOP
             24 JUMP_ABSOLUTE           10
        >>   26 POP_BLOCK

  5     >>   28 LOAD_FAST                1 (c)
             30 RETURN_VALUE

对于相同的操作,您可以看到正在执行的操作数。

【讨论】:

    【解决方案2】:

    第一个本质上更好。它取决于实现和平台,但第一个允许 python 核心以并行方式执行指令。第二个是运行时引擎更难并行执行的迭代。一些 C 和 C++ 编译器甚至能够检测到这些情况,但我认为在 python 中不可能这样做。据我记得,python 生成的编组字节码在几年前我还没有进行过这样的优化。

    主要区别在于函数式编程和顺序编程。在当前平台和当今的 CPU 上,我相信在有意义的情况下使用函数式编程范式会更有效率。

    简而言之,不要决定编译器或运行时可以比您更好地决定的事情。您可能无法判断您的目标是否能够进行并行计算,但运行时可以,这样您就可以选择。

    第一个也有蟒蛇思维。而且,我认为它更具可读性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-31
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多