3 个很酷的 Python 库,可以节省您的时间和精力

发布时间:2022-07-02 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了3 个很酷的 Python 库,可以节省您的时间和精力脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

3 个很酷的 Python 库,可以节省您的时间和精力

嘿,看,我正在使用 Python 徽标。再次。真的只是为了好看的缩略图。

嘿,尊贵的读者。你好吗?好的!很高兴听到。你知道,我真的很关心你的幸福。这就是我写这篇文章原因!上一次,我们讨论了一些用 Python 编写高性能代码的技巧。今天我们将讨论在编写代码时使用开库来节省时间。这不是因为懒惰而做的事情;这是必须要做的事情,因为它会为您节省大量时间、精力和心痛。

当你发现你的小精灵陷入了一些机械问题时,花点时间想想这个问题是否已经在图书馆中解决了。如果是,那么很可能已有数千人在使用它。这意味着它经过实战考验并且广为人知——比你自己可能实现的还要多。

不仅如此,这些库还非常酷且易于使用。我把最好的留到最后,所以,你知道。分叉他们的“平均阅读时间”。

JMES路径

发音为“James-Path”,这是一个帮助查询 JSON 的库。超级简单。你可以在这里找到它!

秒情况:您正在处理一个非常深的 JSON 文档或字典。有时钥匙可能不在那里。让我们假设它看起来像这样:

test_dictionary = {   'level_1': {   'level_2_a': {   'level_3_a': 'some_string'   },   'level_2_b': {   'level_3_b': 'a_different_string'   }   }  }

现在让我们假设低于 1 级的任何级别都可以为空。然后,如果您想安全地到达最深处,则必须执行以下操作:

level_3_a = test_dictionary.get('level_1', {}).get('level_2_a', {}).get('level_3_a', '')

这很糟糕。这是丑陋的代码:难以阅读,并且如果有些事不对的地方,搞清楚什么地方出了错很烂。

相反,让我们尝试 JMESPath:

表达式 = jmespath.COMpile('level_1.level_2_a.level_3_a') 结果 = exPression.seArch(test_dictionary)

JMESPath 使我们能够访问我们渴望的 JSON 或字典对象的那种“JavaScript 风格”对象访问。它使代码更简单,更易于测试。它也是安全的——如果任何路径不存在,JMESPath 的搜索函数将返回 None 而不是爆炸。节省时间和头痛,并使用 JMESPath 解析 JSON 和深度字典。

屈折

Inflection 是一个基于 Ruby 的库。它可以帮助您处理您的字符串,因为字符串处理逻辑可能难以编写,并且您可能第一次错过了很多极端情况。你可以在这里找到它!

让我们来看看一些情况,好吗?

ITuation:您有一组单词想要转换为文章或书籍的标题。它们来自随机来源,而且都很丑陋,而且并不完全是标题形式。

words = {'the_last_mimzy', 'The-Return-Of-the-King', 'ConanTheBarbarian'}

尝试编写自定义代码来检测这些乱七八糟的标题中的缺陷将非常耗时并且有很多边缘情况,尤其是当标题数量或您从中提取的来源数量扩大时。将其卸载到拐点:

words = {'the_last_mimzy', 'The-Return-Of-The-King', 'ConanTheBarbarian'}  titleized_words = [inflection.titleize(word) for word in words]  PRint(titleized_words)>>> [《最后的傻瓜》、《王者归来》、《野蛮人柯南》]

我们不是需要大量测试的数十行(甚至数百行,取决于您的数据的脏程度)代码,而是在一行中解决了我们的问题。不错,对吧?

秒情况:您有要使用的另一种语言或系统生成的变量或数据点的名称,但您需要它们符合 PEP 标准,也就是说,您需要将它们放在蛇形外壳中。也就是说,假设您有一些名称如下的数据点:

外国名字 = {'SystemMemoryusage', 'systemCPU', 'webContainerCGroup'}

就像在我们的“电影/书名”情况下,为了自己做这件事,你需要为这些编写几个解析器,即使这样,还要编写几个测试,以及大量的极端情况。相反,将其卸载到拐点:

Foreign_names = {'SystemMemoryUsage', 'systemCPU', 'webContainerCGroup'}snake_cased_words = [inflection.underscore(name) for name in foreign_names]打印(snake_cased_words) >>> ['system_memory_usage','system_cpu','web_container_c_group']

完美,正是我们所需要的!我们不必进行大规模的字符串格斗,在那里我们将字符串分块,降低它们,等等……只需一个函数调用生活就很好。

这两个例子说明了屈折可以节省您的时间。这个库还有很多用途。这是一个小型图书馆——你应该查看这里的文档以获得更多关于如何使用它的想法!

更多itertools

我答应过最好的。如果在 JSON 解析和字符串转换上节省时间不会让您感到兴奋,那么我为您准备了一些东西。more-itertools 是一个严重的重击者,任何时候当你在迭代列表、集合或其他 Python 可迭代对象时,你应该停下来看看你的问题是否已经被 more-itertools 解决了。真的有那么强大 您可以在此处找到来源。more-itertools 有几类功能可以帮助您编程,我将演示一些。

让我们开始处理几种情况!(我有三个,但第三个有点混乱,所以我把它从文章中砍掉了。不过代码仍在要点中。你可能会喜欢它。)

秒ituation:您有一个字典列表,每个字典都有一个共同的键,并且该键是重复的(例如: id )。您想根据那个通用的重复键将其拆分为多个列表。所以,你有这样的事情:

sample_chunkable_list_of_dictionaries = [   {'id': '1', 'datapoint': 'datapoint_1_1'},   {'id': '1', 'datapoint': 'datapoint_1_2'},   {'id': '1', 'datapoint ': 'datapoint_1_3'},   {'id': '1', 'datapoint': 'datapoint_1_4'},   {'id': '2', 'datapoint': 'datapoint_2_1'},   {'id': '2 ', 'datapoint': 'datapoint_2_2'},   {'id': '2', 'datapoint': 'datapoint_2_3'},   {'id': '2', 'datapoint': 'datapoint_2_4'},   {'id ': '3', 'datapoint': 'datapoint_3_1'},   {'id': '3', 'datapoint': 'datapoint_3_2'},   {'id': '3', 'datapoint': 'datapoint_3_3'} ,   {'id': '3', 'datapoint': 'datapoint_3_4'},  ]

看看“id”键是如何通用的,并且可以重复?让我们把它拆分成一个列表列表,每个列表只包含原始条目中具有相同 id 的条目。我们需要做的就是使用 itertools 中的 split_when 函数,并提供一个比较函数:

split_into_chunks = list(   more_itertools.split_when(   sample_chunkable_list_of_dictionaries, lambda x , y : x ['id'] != y ['id']   )   )

这里的格式会变得非常难看,所以我将向您展示结果的图像:

3 个很酷的 Python 库,可以节省您的时间和精力

使用 more-itertools 的 split_when 函数

正是我们正在寻找的 - 很好地分区。我试着自己写这个程序,它变得非常难看,非常快。必须跟踪列表中的位置是一件痛苦的事情,而且您会招致严重的逐一错误和极端情况。帮自己一个忙,只需使用 split_when 和库中可用的类似功能。

这是 more-itertools 的数据分组功能之一,当您的数据不太整洁时,当您想要分区等时,它还有更多功能。检查一下。

秒情况: 您有多个列表想要合并,但您需要合并列表以将它们的“优先级”保持在一起——您需要循环合并它们。您可以轻松编写此代码,它可能看起来像这样:

3 个很酷的 Python 库,可以节省您的时间和精力

写我自己的交错

嘿,它是递归的!它有效!如果我将它与一些很酷的值一起使用,我们就会得到我们期望的结果:

need_interleaving = [   [1, 3, 5],   [2, 4, 6],   [10, 11, 12, 13]  ]打印(hand_rolled_interleave(need_interleaving))>>> [1, 2, 10, 3, 4, 11, 5, 6, 12, 13]

有几个问题。首先,它是递归的,尝试阅读时会立即感到困惑。其次,它相当复杂,数据结构和理解不断变化。第三,它在大规模上是缓慢的。我可以使用一种称为 interleave_longest 的方法(以确保我们在用完一个可迭代对象后不会停止),而不是在一个很棒的单行中:

need_interleaving = [   [1, 3, 5],   [2, 4, 6],   [10, 11, 12, 13]  ]# * 是一个扩展运算符——它让我一次传递所有 列表 print(list(more_itertools.interleave_longest(*need_interleaving))>>> [1, 2, 10, 3, 4, 11, 5, 6, 12, 13]

凉爽的!所以代码不是递归的,也不复杂或难以阅读。但是性能呢?让我们试一试吧。

(venv) mydriasis@akkad:~/Desktop/article-code/oss-libs$ python more-itertools-test.py  Interleave 10 个长度为 100 的列表每个需要 0.0000069141ms 和 more_itertools  Interleave 10 个长度为 100 的列表每个需要 0.0000069141ms ms 与手卷交错

看哪,我愚蠢的手卷方法比 itertools 的时间长一百倍。此外,因为它是递归的,所以它不能扩展。如果列表长于 Python 的最大递归深度,这只会以 RecursionError 爆炸。

看?使用图书馆是值得的。这意味着我们不必自己提出常规实现,或调整递归限制。这是 more-itertools 的组合功能之一,还有很多其他功能。

归根结底,我真的被 more_itertools 惊艳到了。它有很多我可以看到自己一直在使用的功能,而且它们可能比我能写的任何东西都更有效率。说实话,我不是一个比71 位专职 Python 工程师更好的程序员。

每个程序员都需要停止做这 7 件事

结论

好吧,我们又来了,你和我。在另一篇文章的结尾,你肯定读了这么多。也许你喜欢这个概述。也许你学到了一些东西。也许您最终会使用 JMESPath,因为解析 JSON 很糟糕。或者,您可能在 30 秒内退出了,因为您看到了代码块的顶部,它让您失望了。不管怎样,我希望你喜欢。与往常一样,您可以在绝妙的gist 中找到本文的示例代码。我一直……嗯,程序员。我们下次会在不想阅读但由于标题吸引人的情况下仍然阅读的文章中与您见面

脚本宝典总结

以上是脚本宝典为你收集整理的3 个很酷的 Python 库,可以节省您的时间和精力全部内容,希望文章能够帮你解决3 个很酷的 Python 库,可以节省您的时间和精力所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。