嘿,看,我正在使用 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']   )   )

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

使用 more-itertools 的 split_when 函数

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

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

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

写我自己的交错

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

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 库,可以节省您的时间和精力相关推荐

  1. 2021年最有用的数据清洗 Python 库

    作者 | 周萝卜 来源 | 萝卜大杂烩 大多数调查表明,数据科学家和数据分析师需要花费 70-80% 的时间来清理和准备数据以进行分析. 对于许多数据工作者来说,数据的清理和准备也往往是他们工作中最不 ...

  2. 独家 | Bamboolib:你所见过的最有用的Python库之一(附链接)

    作者:Ismael Araujo 翻译:王可汗 校对:欧阳锦本文约3200字,建议阅读5分钟 本文介绍了Python数据分析的一个利器--Bamboolib,它无需编码技能,能够自动生成pandas代 ...

  3. 年终总结:2021年最有用的数据清洗 Python 库

    大多数调查表明,数据科学家和数据分析师需要花费 70-80% 的时间来清理和准备数据以进行分析. 清理和准备数据既繁琐又辛苦,但数据越干净.越有条理,后面的一切工作都会变得更快.更轻松.更高效. 本文 ...

  4. 2021年最有用的数据清洗 Python 库!建议看一下!

    大多数调查表明,数据科学家和数据分析师需要花费 70-80% 的时间来清理和准备数据以进行分析. 对于许多数据工作者来说,数据的清理和准备也往往是他们工作中最不喜欢的部分,因此他们将另外 20-30% ...

  5. 8个可以提高数据科学工作效率、节省宝贵时间的Python库

    来源:DeepHub IMBA 本文约2900字,建议阅读5分钟 在进行数据科学时,可能会浪费大量时间编码并等待计算机运行某些东西.所以我选择了一些 Python 库,可以帮助你节省宝贵的时间. 1. ...

  6. 8个可以提高数据科学工作效率并节省宝贵时间的Python库

    在进行数据科学时,可能会浪费大量时间编码并等待计算机运行某些东西. 所以我选择了一些 Python 库,可以帮助你节省宝贵的时间. 1.Optuna Optuna 是一个开源的超参数优化框架,它可以自 ...

  7. 必备 | 人工智能和数据科学的七大 Python 库

    来源:新智元 本文约3100字,建议阅读10+分钟. 本文汇总了2018年针对数据科学家/AI的最佳库.repos.包和工具. [ 导读 ]作者根据每周发布总结的系列文章,汇总了2018年针对数据科学 ...

  8. 手把手教你上手python库pydbgen(附代码、安装地址)

    原文标题:Introducing pydbgen: A random dataframe/database table generator 作者:Tirthajyoti Sarkar 翻译:王婷 校对 ...

  9. python添加lxml库_7分钟,建议看完这5个Python库对比丨web抓取

    网页抓取的时候,如何决定哪一个库适合自己的特定项目?哪个Python库最灵活?5个示例找寻答案. 文丨ABHISHEK SHARMA 编译丨小二 "我们有足够的数据"这句话,在数据 ...

  10. 十大被低估的python库_小白必读!十大被低估的Python自带库!

    原标题:小白必读!十大被低估的Python自带库! 大家在学习python的过程中,都会了解到python的一个强大的功能在于各种强大的第三方库函数,大家只需要通过pip install 即可安装我们 ...

最新文章

  1. mysql sysdate() 慢_mysql笔记
  2. python控制单片机keil_PCF8591使用及Python控制
  3. map以及类似指针iterator
  4. 为什么Java中只有值传递?
  5. R语言数据转换(split-apply-combin…
  6. 我个人的CRUD故事-或我如何来到CUBA平台
  7. python 字符串%和format_Python必懂知识点,格式化字符串,到底用.format还是%
  8. swing的jlist的值怎么获取_彻底解决安卓/IOS获取蓝牙ID不一致的问题
  9. 虚拟机中qemu模拟开发板启动过程,使用nfs挂载根文件系统
  10. sql prompt linux,sqlplus中灵活使用sqlprompt提示符
  11. 拼多多砍价群大王:拼多多为什么3年就能上市?
  12. win10-两电脑通过一根网线连接
  13. linux上系统烧录工具,烧录操作系统安装光盘镜像到 U 盘的方法
  14. [PTA] 第四章 题解
  15. 关于OSPF的五种报文类型介绍、OSPF八种状态机变化与报文交互介绍。
  16. HTML高德地图标注,文本标记-点标记-示例中心-JS API 示例 | 高德地图API
  17. JQuery序列化和反序列化
  18. Android之短信验证码
  19. 求阶乘问题c语言编程,求阶乘问题
  20. Parameter 'goodsName' not found. Available parameters are [ param1, goods]

热门文章

  1. 分享Visual SVN Hook Script—— 允许客户端编辑SVN log message
  2. bio linux 创建_Linux 五种IO模型
  3. linux火狐怎么清除缓存文件,火狐浏览器如何设置_火狐浏览器怎样清除缓存
  4. go的编程哲学和设计理念
  5. windows 平台 atom编辑器常用快捷键
  6. 计算机精品视频教程合集
  7. <C语言>数据文件自动生成(多模块进阶)
  8. Python 爬虫抓站 记录
  9. 六、小程序|App抓包-移动端抓包app-抓包
  10. Crystal Ball 图标进入EXCEL后却没加载 Crystal Ball