Python 循环 vs 理解列表 vs 映射的副作用(即不使用返回值)

标签 python dictionary coding-style list-comprehension maintainability

TL;DR 哪一个最好?

1.- [r.update(r.pop('some_key')) for r in res if r.get('some_key')]

2.- map(lambda r: r.update(r.pop('some_key') if r.get('some_key') else []), res)

3.- map(lambda r: r.update(r.pop('some_key')), filter(lambda r: r.get('some_key'), res))

4.- for r in res:
        if r.get('some_key'):
            for element in r['some_key']:
                r[element] = r['some_key'][element]
            del r['some_key']

5.- Insert your own approach here

注意:这不是生产代码。它是在测试套件中运行的代码,因此我更关心易读性/可维护性而不是性能。尽管如此,我也想知道如果这是生产代码,关于哪个更好的决定(考虑性能/易读性的权衡)是否会改变。如果这有影响的话,元素“some_key”的数量非常小。

上下文:我已阅读 Python List Comprehension Vs. Map其中接受的答案是:

[...] List comprehensions may be faster in other cases and most (not all) pythonistas consider them more direct and clearer [...].

尽管如此,Is it Pythonic to use list comprehensions for just side effects? 的接受答案说:

It is very anti-Pythonic to do so [use comprehension lists for side effects only, ignoring return value], and any seasoned Pythonista will give you hell over it. The intermediate list is thrown away after it is created, and it could potentially be very, very large, and therefore expensive to create.

PS:我已经对哪一个最好有自己的看法,但我的一位同事不同意。这就是我询问的原因。

最佳答案

1.- [r.update(r.pop('some_key')) for r in res if r.get('some_key')]

不建议使用列表理解来产生副作用。它创建一个列表,该列表在操作结束时被丢弃

2.- map(lambda r: r.update(r.pop('some_key') if r.get('some_key') else []), res)

1 没有太大区别,只是这会在 Py 3.X 中中断。

3.- map(lambda r: r.update(r.pop('some_key')), filter(lambda r: r.get('some_key'), res))

3 更糟糕。除了使用 map 和依赖副作用之外,您还增加了函数调用的开销

4.- for r in res:
        if r.get('some_key'):
            for element in r['some_key']:
                r[element] = r['some_key'][element]
            del r['some_key']

这比其他的要好

  1. 没有生成将被丢弃的不必要的列表
  2. 适用于 Py 3.x
  3. 没有显式函数调用开销

5.- 在此处插入您自己的方法

    for r in res:
        if 'some_key' in r:
            r.update(r['some_key'])
            del r['some_key']

关于Python 循环 vs 理解列表 vs 映射的副作用(即不使用返回值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14633298/

相关文章:

python - 重复正则表达式的一部分?

html - 如何划分我的 html 页面以显示带有 float 侧面板的 map 和标题栏

java - 每次创建一个新对象或保留一个

java - 我们应该在 Java 中保持每行 80 个字符吗?

java - 编码约定 - 命名枚举

python - 在 CircleCi 构建中引用外部私有(private) Git 存储库

python - Django/mysql中间表不插入数据

python - DataFrame 中的最后一个匹配值(Python)

c# - 使用类型和操作在 C# 中查找表

c++ - 加速 std::map 和 boost:unordered_map [] 操作