Python的极限是啥? [关闭]

Posted

技术标签:

【中文标题】Python的极限是啥? [关闭]【英文标题】:What are the limits of Python? [closed]Python的极限是什么? [关闭] 【发布时间】:2009-11-24 19:26:02 【问题描述】:

我花了几天时间阅读有关 C++ 和 Python 的内容,发现 Python 非常简单易学。

所以我想知道花时间学习它真的值得吗?还是我应该把时间花在学习 C++ 上?

C++ 能做什么而 Python 不能?

【问题讨论】:

两种语言都是图灵完备的——它们可以做同样的事情。请编辑您的问题以删除“C++ 可以做什么而 python 不能做什么?”这不是一个明智的要求。 使用 C++,您可以在脚上开枪,将整条腿都炸掉。 我不同意@S.Lott。他们都可以提供相同的算法这一事实并不意味着他们可以做同样的事情。 C++ 可以用这个算法在不到 3 秒的时间内解决这个问题就是一个例子。 Python 可以让你在不到 1 分钟的时间内编写这个算法是另一种。 @e-satis:性能(以及与实现相关的内存和其他指标)与“C++ 能做什么而 Python 不能?”无关。这些只是实现的度量,而不是语言的特性。 执行时间和执行速度是特征。 【参考方案1】:

一些 Python 限制:

- Python 很慢。 它可以通过多种方式进行改进(请参阅其他答案),但简单的 cPython 比 C/C++ 慢 100 倍。

这个问题越来越得到缓解。使用 Numpy、Pypy 和 asyncio,大多数性能问题都没有被覆盖,只有非常具体的用例才成为 Python 的瓶颈。

- Python 对任何东西都是开放的。 保护/混淆/限制 Python 代码真的很难。

- Python 不是炒作。 与 Ruby 不同,Python 周围没有“酷潮”,而且要找到一个有经验的 Python 编码器仍然比 Java 或php 专业版。

- 在使用 Python 之后,很多语言似乎都很难使用。 你会认为它很好,但相信我,并非总是如此。当你在一个 Python 项目之后不得不去 javascript 时,你的眼睛至少会流泪 3 天。真的很难上手。

- 比 PHP 等流行的解决方案更难找到网络托管

- 作为一种动态语言,您没有使用 Java 和 Eclipse 或 C# 和 VS 可以获得的非常方便的重构工具

- 出于同样的原因,您不能依赖类型检查作为安全网。这就是为什么 pythonistas 倾向于遵循最佳实践并比其他人更频繁地编写单元测试。

- 看来我只是找不到具有良好代码完成功能的 IDE。 PyDev、Gedit、Komodo、SPE 等只是做得不够好。

有了 Python 3 类型提示和 PyCharm 或 Sublime Text+Anaconda 等工具,情况发生了很大变化。

- 最好的文档仍然只有英文。有些人不能很好地处理它。

- 你必须习惯语法。你不仅得到空格和换行符而不是括号,而且你可以忘记长 lambdas、--i 和三元运算。 p>

现在,对我来说,这些并不是不学习一种能让您在获得更多乐趣的同时产出更多的工具的理由。但也许只有我 :-)

老实说,鉴于:

C++ 更难学习; 您几乎可以使用 Python 做任何您想做的事情; 您将在项目中使用 Python 更快地获得结果。

除非你有涉及C++的专业问题,否则最好先学习Python,这样更有动力。你以后仍然可以学习 C++,它是一种对系统编程、嵌入式设备等有用的语言。

不要试图同时学习两者,多任务处理很少有好的结果。

【讨论】:

+1 用于实际回答所提出的问题。 那么我喜欢 Python 和 JavaScript 是不是很糟糕? 我也喜欢 Javascript,但很喜欢很辣的食物,我需要时间才能不哭就回到它。 感谢 Ulipad,我是新的,我以前用过 PyScripter。 Python 被炒作了。 Ruby 没有被炒作。 Ruby on rails 是。把铁轨拿走,谁用红宝石?【参考方案2】:

这就是为什么值得学习 Python:

相对较少的问题受到算法速度的限制。比较多的问题是受限于开发者的速度。

【讨论】:

抱歉,迟到了,但是,嗯,是的!【参考方案3】:

你为什么不问相反的问题?与 C++ 不同,Python 可以通过其import 命令为您提供antigravity 和召唤souls。另一方面,C++ 的“等价物”——#include——只允许你获得一些无聊的 I/O 和数学库。

说真的.. C++ 允许您做更多低级的事情,例如内核编程,并允许您编写运行速度更快的程序(大约 ~20x)。 您可以使用它来创建可以利用多核处理器的真实线程,而 Python (due to its design) 通常只能在单核上运行其模拟线程。

恕我直言,您应该两者都学; Python 用于 Web 开发和快速而肮脏的脚本,C++ 用于编写系统代码、桌面应用程序,以及对计算机有更好的底层理解。如果你刚刚开始,那么 Python;开始会容易得多。

关于速度差异的更具体测量可以找到here.

编辑: 好像我关于多线程的信息已经过时了;请参阅 John Paulett 的评论。

【讨论】:

有了新的多处理模块,单核警告不再适用。此外,Jython 和 Ironpython 等其他实现不会像 CPython 那样受到 GIL 的影响。 另外,在速度方面,我很幸运地使用 Pysco 和 Cython 显着加速了 Python。 Pysco 对代码进行 JIT 处理,是获得 4-100 倍改进的快速方法(尽管它只有 32 位,因为开发人员现在正在使用 PyPy)。 Cython 实际上会将大多数 Python 代码转换为 C 代码,您可以使用 gcc 使用其优化 (-O3) 对其进行编译。在一段代码中,我的速度提高了近 1000 倍。 Python 还具有出色的绑定工具,因此如果您使用 Python 编写应用程序并发现一个慢点,您可以将该代码重写为 C 并使用 SWIG 或 ctypes 来调用它。【参考方案4】:

一般来说,它们不会用于相同种类的事情。 Python 对于原型设计非常有用,因为它非常简单,但当速度是一个重要因素时,它并不总是最佳选择,因为它是一种解释型语言。 C++ 可以进行大量优化,但正如您所说,可能更难编写和理解。

如果你想做系统或应用程序编程,你应该学习 C++。如果您是为了娱乐和休闲而编程,或者解决http://projecteuler.net/ 之类的问题,那么 Python 也是一个不错的选择。

如果你想认真对待编程,我个人也建议先学习 C/C++,因为它教给你内存管理的重要概念,这在托管语言中可能会被忽略。

【讨论】:

在疯狂的 C++ 混乱之前一定要学习简单的 C!【参考方案5】:

如果你想知道你是否还会被雇用 稍后使用 C++ 或 Python,不要担心单一语言的寿命。 学习编程。不要在<insert a language here>.中学习编程

这是一个类比:如果您的汽车运行良好(让您到达目的地 去,有很好的里程,维护便宜,相对安全),有 没有合乎逻辑的理由将其换成另一个。没有任何。任何。 在您考虑使用什么品牌或型号之前将其推向地面 下一个。但是如果你已经在四处寻找什么车 得到,去得到它,别再问你认识的每个人你是否应该 做。如果你需要问,你需要改变它。这很简单 那。

【讨论】:

我们在地球上学习和学习的时间有限,必须要有事业心。如果我现在可以花 X 小时学习 C,或者现在花 X 小时学习 插入时髦的技术肯定会在 5 年内获得美元的工作,我会选择后者,因为它在简历上看起来不错人们喜欢雇佣有经验的人。当然,您应该始终使用最好的工具来完成这项工作,但是如果您在有护卫舰可用的情况下驾驶一辆破旧的掀背车,那您就是不聪明。 @Stefan Kendall:我不是专业程序员(我希望我能成为一名程序员,因为我对编程热情),但我想说你的意见让我感到震惊。我的意思是,学习一门技术仅仅是因为它在简​​历上看起来不错?而且,请告诉你,是什么让你觉得简历上的 C 不“看起来不错”? 简历上看起来不错的部分取决于您希望自己的职业发展方向。对于 Web 开发人员的职业生涯,列出 C 可能不会帮助您找到工作(也不是说它会减损,除非您只知道这些)。鉴于可用的学习时间有限,您最好学习需要的技能而不是无市场的技能。 从 TIOBE 索引来看,C 和 C++ 是前四种语言中的两种。因此,他们享有相当的人气。但很少有“性吸引力”。【参考方案6】:

据我所知,学习 C++ 的 1% 是在学习 C。1% 是在学习额外的基本功能。 98% 的人正在学习以安全、可维护的方式使用这些功能,并应对语言的阴暗面。

学习 python 将教您编写安全且可维护的代码。我认为如果你学习 python 然后回到 C++,那么你将能够编写好的 C++ 代码。当然,这并不意味着你会理解糟糕的 C++ 或以非 Python 方式编写的 C++ 代码。

对 python 的限制?

它是解释的,所以你必须运送源和解释器;并且流程将需要更长的时间才能启动。 它不是 C++,所以它不能与现有的 C++ 代码一起使用。 它有点慢(即使您将热循环包装在 C 中)。* 它鼓励你成为“pythonic”,如果你不是“pythonic”,一些问题会更容易。

*Python 可能更快:

自动气相色谱。只有在不泄漏太多的情况下,C++ 才会更快。 字典。如果您使用字典,很多代码在 O(N 加上一点) 中运行,而不是 O(N^2)。当然,您可以在 C++ 中使用哈希表,但并非所有人都可以。 内存管理 - python 解释器缓存一些基本数据结构的内存,然后重新分配它们,而不是通过系统获取新内存。这减少了系统调用,这是一件非常好的事情。 在 python 上分析新算法要容易得多。在很多问题中,更好的算法比线性加速(这是 C++ 给你的)更重要。 如果你正在制作一个“只运行一次”的程序(科学分析、数据迁移等),那么在 python 中编译-构建-测试周期应该更快。这才是真正重要的 ;)

【讨论】:

对“O(N plus a bit)”与“O(N^2)”的引用是错误的。 (要点是合理的,但误用 big-O(复杂性的计算顺序)表达式会破坏您的可信度。字典(哈希表)上的操作是 O(1)(接近恒定时间)。通过数组搜索(更简单例如,在 C 程序中实现)是 O(n)(线性)时间。二进制搜索是 O(log(n))(对数)时间。矩阵运算通常是 O(n**2)(二次)时间和诸如 O(n*log(n)) 的 qsort 之类的东西。研究该列表并正确使用它们以最大限度地提高您的可信度。 我知道。但通常重要的代码是诸如“对于所有节点,查找重复项”之类的代码。如果使用字典,则为 O(N 加一点),如果使用列表,则为 O(N^2)。 “加一点”是因为字典在变大时会获得较小的打包率(因此会有更多的冲突)。抱歉,我没有解释得太清楚。 您不必运送解释器 - 只需告诉用户在哪里下载即可。【参考方案7】:

学习静态类型语言和脚本语言。 你可以用任何一种语言做任何你想做的事情。与具有相同能力水平的 Python 代码库相比,编写良好的 C++ 代码库更易于维护/调试。

如果您的目标是编写 Web 内容或编写脚本,那么 Python 适合您。任何更高级的东西都需要 C++。

话虽如此,还是选择 Python。

【讨论】:

您可以使用 Python 编写更高级的应用程序。 Mercurial、BitTorrent 和 Gentoo 的 Portage 只是一些用 Python 编写的更复杂的应用程序。 您可以用 Python 编写更复杂的应用程序。 python.org/about/success 但如果有选择,你可能不会 我不同意大型项目的问题。我不确定哪一个更容易,但从我对这个问题的所有阅读来看,其他人也不是。有很多具体的理由选择 Python 而不是 C++(反之亦然),但据我所知,在 C++ 中维护/调试更容易,见仁见智。【参考方案8】:

正如其他人所建议的那样:学习 Python 以研究算法和更高层次的概念,并将其用于原型设计和您可以使用的地方。为就业市场和必须使用它的情况学习 C/C++ 和/或 Java。

Python 非常简单的语法和高级库让您可以专注于接口和抽象,同时仍然拥有功能原型。

【讨论】:

【参考方案9】:

目前尚未提及的一个显着差异是构建为本机代码的 C++ 等语言与默认情况下在您和硬件之间放置 VM 的 Python 等语言之间的差异。对于低级工作,例如针对操作系统内核进行编码,本地语言将是首选。

不过,在实践中,当您在该上下文中工作时,通常意味着完全放弃 C(作为可移植汇编程序的角色),而不是能够使用 C++(及其运行时库),如果不是所有的代码。

【讨论】:

【参考方案10】:

人们经常使用 C 而不是(据我所知)Python 的一件事是低级代码,例如操作系统内核和嵌入式软件。

C 有很多结构可以很容易地实现,例如,将任意机器地址转换为指针并取消引用它,或者告诉编译器用于内存映射 I/O 的地址甚至可能会改变虽然这个程序没有改变它,或者指定一个对象在内存中的确切布局。它旨在尽可能快地运行,尽可能少地浪费内存,而不是安全。

这就是那些“让你在脚上开枪”的cmets主要指的。

【讨论】:

【参考方案11】:

Python 与 Java、Perl 和其他编程语言的比较

教授。卡尔斯鲁厄大学的 Lutz Prechelt 将 Python 与其他编程语言进行了比较。他总结了他的结果:“对同一组需求的 80 个实现进行了几个属性的比较,例如运行时间、内存消耗、源文本长度、注释密度、程序结构、可靠性以及编写它们所需的工作量。结果表明,对于给定的编程问题,涉及字符串操作和字典中的搜索,“脚本语言”(Perl、Python、Rexx、Tcl)效率更高 比“传统语言”(C、C++、Java)。在运行时间和内存消耗方面,它们通常比 Java 好,并且比 C 或 C++ 差不了多少。总的来说,语言之间的差异往往更小(参见 Lutz Prechelt,C、C++、Java、Perl、Python、Rexx 和 Tcl 的实证比较,IEEE 计算机,第 30 卷,(10),第 10 页)。 2000 年 10 月 23-29 日。)

source link

【讨论】:

以上是关于Python的极限是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Python - 所有内置装饰器是啥? [关闭]

Python 中类型提示的好处是啥? [关闭]

Python中的子进程是啥? [关闭]

Django 框架的推荐 python 版本是啥? [关闭]

用于 AES 256 加密的(纯)Python 库是啥? [关闭]

Python 中的退出代码 77 是啥意思? [关闭]