Code前端首页关于Code前端联系我们

从Python转向Go编程语言背后的九个原因以及如何转换

terry 2年前 (2023-09-25) 阅读数 46 #后端开发
Stream团队的主要编程语言从Python转向Go。本文解释了其背后的九个原因以及如何进行转换。 为什么使用Go 原因1:性能编程语言从 Python 转向 Go 背后九大原因和如何转换它运行速度非常快。其性能与Java或C++类似。在我们的使用中,Go 通常比 Python 快 30 倍。以下是 Go 和 Java 之间的基准比较:编程语言从 Python 转向 Go 背后九大原因和如何转换编程语言从 Python 转向 Go 背后九大原因和如何转换编程语言从 Python 转向 Go 背后九大原因和如何转换编程语言从 Python 转向 Go 背后九大原因和如何转换 原因 2:语言技能很重要 对于许多应用程序来说,编程语言就像你和数据集之间的粘合剂。语言的显示往往毫无意义。但 Stream 是一家 API 提供商,为财富 500 强和超过 2 亿终端用户提供服务。多年来我们改进了 Cassandra、PostgreSQL、Redis 等,但最终我们达到了我们所使用的语言的极限。 Python 相当不错,但在序列化/反序列化、排序和收集方面却很糟糕。我们经常面临这样的问题:Cassandra需要1ms才能返回数据,而Python需要10ms才能将其转换为对象。原因 3:开发者成功且不要更新太多查看优秀的入门教程中的一小段代码《开始学习 Go 语言》 (http://howistart.org/posts/go/1/):编程语言从 Python 转向 Go 背后九大原因和如何转换 如果您是新人,看到这段代码你不会感到惊讶。它提供了各种角色、数据结构、指针、格式和内置 HTTP 库。当我第一次开始编程时,我喜欢使用 Python 的更高级功能。 Python 允许您创造性地使用您编写的代码。例如,您可以:
  • 在代码初始化期间使用MetaClass自行注册类
  • 替换true和false
  • 将函数添加到内部函数列表中
  • 与Wonderful的方式太多
这段代码无疑很有趣,但是在阅读其他人的作品时也很难理解代码。 Go 迫使您坚持基础知识,这使得您可以轻松阅读任何代码并快速弄清楚发生了什么。注意:当然,简单的方法取决于您的使用情况。如果你想创建一个基本的CRUD API,我仍然推荐使用Django + DRF,或者Rails。原因 4:并发和通道 Go 是因为语言试图让事情变得简单。它没有引入很多新想法,而是专注于创建一种非常快速且易于使用的简单语言。它唯一的更新是 goroutine 和 pipelines。 Goroutines 是 Go 的轻量级、面向线程的方式,而管道是 Goroutines 之间通信的最佳方式。 Goroutine 很容易创建,只需要几千个额外的内存,允许数百或数千个 Goroutine 同时运行。您可以借助管道与 goroutine 进行通信。 Go 的流程可以代表任何复杂性。 Goroutines 和基于管道的同步方法可以轻松使用所有可用的 CPU 内核并同时管理 IO - 无需复杂的演进。与 Python/Java 相比,在 Goroutine 中运行任务需要最少的样板代码。只需使用“go”关键字添加函数调用即可:编程语言从 Python 转向 Go 背后九大原因和如何转换与必须密切关注管理异步代码的 Node 相比,并发方法非常容易上手且有趣。并发的另一个重要功能是竞争检测器,它可以轻松地找出异步代码中是否存在竞争条件。以下是一些开始使用 Go 和通道的重要资源:
  • https://gobyexample.com/channels
  • https://tour.golang.org/concurrency/2
  • http://guzalexander。 com/2013/12/06/golang-channels-tutorial.html
  • https://www.golang-book.com/books/intro/10
  • https://www.goinggo.net/2014/ 02/the-nature-of-channels-in-go.html
原因五:编译速度快我们用Go编写的最大的微服务的编译时间只有6秒。相比于Java和C++的编译速度,Go快速的编译时间在性能上是一个巨大的优势。我喜欢击剑,但只要我记得代码应该做什么,就更好了。 编程语言从 Python 转向 Go 背后九大原因和如何转换 在 Go 之前编译代码的 6 个理由:构建团队能力 首先,最明显的一点是:Go 的开发人员比 C++ 和 Java 等老语言要少。据了解,38%的开发者了解Java,19.3%了解C++,只有4.6%了解Go。GitHub 数据显示了类似的趋势:Go 比 Erlang、Scala 和 Elixir 更流行,但不与 Java 和 C++ 相比。幸运的是,Go 非常简单易学。它只提供基本功能,没有任何装饰。 Go 引入的新概念是“延迟”语句以及带有 goroutine 和管道的内置并发管理。由于 Go 的简单性,任何 Python、Elixir、C++、Scala 或 Java 开发人员都可以在一个月内创建一个成功的 Go 团队。原因 7:强大的生态系统 对于这种规模的团队(约 20 人)来说,生态系统非常重要。如果您必须重做所有功能,您将无法为客户带来收入。 Go 拥有强大的硬件支持以及针对 Redis、RabbitMQ、PostgreSQL、模板定义、作业调度、表达式分发和 RocksDB 的内置库。 Go 的环境比 Rust 和 Elixir 等语言具有显着的优势。当然,它比 Java、Python 或 Node 这样的语言稍逊一筹,但它非常稳定,而且你会发现已经有很多基本需求的高级包了。理由8:GOFMT,代码格式压缩 Gofmt是Go编译器内置的一个强大的命令行,用于确定代码格式。基本上,它类似于Python的autopep8。合规设计很重要,但实际的设计标准并不总是那么重要。 Gofmt 使用一套正式的代码来避免不必要的对话。原因 9:gRPC 和 Protocol Buffers Go 语言对 protocol buffers 和 gRPC 具有一流的支持。这两个工具可以很好地协同工作,用于构建需要与 RPC 通信的微服务。我们只需要编写一条语句来定义 RPC 调用的事件和参数,然后服务器和客户端代码就会根据该事件自动生成。以这种方式生成代码不仅速度快,而且需要最少的网络使用。通过相同的暴露,我们可以使用不同的语言(例如 C++、Java、Python 和 Ruby)创建客户端代码。因此内部连接 ​​RESET 端点没有不同,我们需要编写几乎相同的客户端和服务器代码。使用Go语言的缺点 缺点一:缺乏框架 Go语言缺乏一个主要的框架,比如Ruby的Rails框架,Python的Django框架,或者PHP的Laravel。这是 Go 社区中的一个非常热门的问题,因为许多人认为我们不应该从框架开始。在很多情况下都是如此,但如果您只想构建一个简单的 CRUD API,那么使用 Django/DJRF、Rails Laravel 或 Phoenix 会更容易。缺点2:Go语言的贡献帮助开发者通过简单地从函数返回错误(或返回调用)和预期的调用代码来处理错误。尽管这种方法很有效,但很容易忘记错误发生的位置,从而很难误导用户。错误包可以解决这个问题,它允许我们为返回的错误添加上下文和堆栈。另一个问题是我们可能会忘记错误处理。 errcheck 和 megacheck 等静态分析工具可以防止这些错误。尽管这些解决方案很有效,但它们可能不是正确的方法。缺点三:包管理 Go语言的包管理非常不完善。默认情况下,它无法确定依赖库的版本,或创建可编辑的构建。相比之下,Python、Node 和 Ruby 都有更好的包管理系统。然而,使用正确的工具,Go 语言中的包管理也可以发挥同样的作用。我们可以使用Dep来管理依赖关系,它还可以定义自定义版本。另外,我们还可以使用一个名为VirtualGo的开源工具,它可以轻松管理多个Go语言编写的项目。 编程语言从 Python 转向 Go 背后九大原因和如何转换Python 与 Go 我们所做的一个有趣的实验是用 Python 编写数字提要,然后用 Go 编写。请参阅以下此排序方法的示例: 编程语言从 Python 转向 Go 背后九大原因和如何转换 Python 和 Go 都需要满足以下要求才能支持上述排序方法:
  1. 删除数字表示。在此示例中,我们希望将字符串 simple_gauss(time)* 转换为一个函数,该函数将事件作为输入并返回一个数字作为输出。
  2. 在 JSON 配置中创建一些函数。例如,我们希望“simple_gauss”被称为“decay_gauss”,密钥对为“scale”:“5d”,“offset”:“1d”,“decay”:“0.3”。
  3. 删除“默认”设置,以便在未指定字段时更轻松地进行注释。
  4. 首先使用步骤 1 中的功能标记源中的所有活动。
Python版本的分类代码的开发大约花了3天时间,包括编码、测试、文档。然后,我们花了大约两周的时间优化代码。一项改进是将表达式 simple_gauss(time)*name 转换为抽象语法树。我们还实现了缓存逻辑,之后每次都会预先计算分数。相比之下,Go 版本代码的开发时间为 4 天,但之后不需要任何进一步的改进。因此,虽然 Python 最初的开发速度更快,但最新的 Go 需要的工作量更少。此外,Go 代码比高度优化的 Python 代码快 40 倍以上。以上是我们从转向 Go 中获得的好处之一。当然,你不能这样比较:
  • 这个分类代码是我用Go写的第一个项目;
  • Go 代码是在 Python 代码之后编写的,所以我明白了;
  • Go 语言阅读库质量很好。
Elixir 与 Go 我们研究的另一种语言是 Elixir。 Elixir 构建于 Erlang 虚拟机之上。这是一门令人惊叹的语言,我们开发它是因为我们的一个小组成员在 Erlang 方面非常有经验。在我们的用例中,我们看到 Go 具有更好的原始性能。 Go 和 Elixir 都可以处理数千个并行请求,但是,就单个请求而言,Go 更快。我们选择 Go 而不是 Elixir 的另一个原因是环境。至于我们需要的组件,Go的库更加成熟。在许多情况下,Elixir 库不适合生产使用。同时,也很难找到/培训也使用 Elixir 的开发人员。结论 Go 是一种非常高效的语言,具有高并发支持。同时它的速度与C++和Java一样快。虽然与 Python 和 Ruby 相比,用 Go 构建东西需要更多的时间,但它可以在后续的代码优化中节省大量时间。在 Stream,我们有一个小型开发团队,为 2 亿终端用户提供服务。对于新开发人员来说,强大的环境、易于学习、快速的性能、高并发支持和高效的编程环境的结合使其成为一个不错的选择。 Stream 仍然使用 Python 进行自定义提要,但所有强大的代码都将用 Go 编写。原文地址:https://getstream.io/blog/switched-python-go/

作者:机器之心
链接:https://juejin.im/post/59e6f4f151882578d50394fc
'版权的作者。如需商业印刷,请联系作者以获得许可。非商业转载请注明来源。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门