首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Python这么慢?

用.NET实现的叫IronPython,Java的叫Jython,用Python实现的叫PyPy 我想回答这个问题:当Python比另一种语言慢2 - 10倍完成一个可比较的应用程序时,为什么它慢,我们不能使它更快...如果您以前没有做过多线程编程,那么您需要快速熟悉锁的概念。与单线程进程不同,您需要确保在更改内存中的变量时,多个线程不会尝试同时访问/更改相同的内存地址。...如果引用的数量为0,那么它将从系统中释放那块内存。这就是为什么在for循环的范围内创建“临时”变量不会增加应用程序的内存消耗。 当变量在多个线程中共享时,挑战就变成了CPython如何锁定引用计数。...那么,如果Python都使用虚拟机和某种字节码,那么为什么在基准测试中它比Java和c#慢那么多呢? 首先,. net和Java是jit编译的。...CPython的启动时间已经比较慢了,PyPy比CPython慢2 - 3倍。众所周知,Java虚拟机的启动速度很慢。

1.5K20

为什么 Python 这么慢?

在代码运行速度方面,Java、C、C++、C# 和 Python 要如何进行比较呢?...根据我这些年来进行语言基准测试的经验来看,Python 比很多语言运行起来都要慢。...如果你还没有写过多线程执行的代码,你就需要了解一下线程锁的概念了。多线程进程比单线程进程更为复杂,是因为需要使用线程锁来确保同一个内存地址中的数据不会被多个线程同时访问或更改。...既然 Python 像 Java 和 C# 那样都使用虚拟机或某种字节码,为什么 Python 在基准测试中仍然比 Java 和 C# 慢得多呢?...CPython 的启动时间已经相对比较慢,而 PyPy 比 CPython 启动还要慢 2 到 3 倍。Java 虚拟机启动速度也是出了名的慢。.

1.5K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python 为什么这么慢?

    所以操作系统抽象出 Thread,可以在一个进程中 spawn 出多个 Thread,让这些 Thread 在多个核上面同时运行,发挥处理器的最大效率。...(在 top 命令里面可以看到系统中的 threads 数量) 所以很显然,在编程时使用 Thread 来并行化运行可以提升速度。 但是 Python (有时候)不行。...简单说,CPU 密集型的任务,Python 的多线程确实没啥用(甚至因为多线程切换的开销还会比单线程慢),IO 密集型的任务,Python 的多线程依然可以加速。...为什么 Python 没有 JIT 呢? 第一是 JIT 开发成本比较高,非常复杂。C# 也有很好的 JIT,因为微软有钱。 第二是 JIT 启动速度慢,Java 和 C# 虚拟机启动很多。...动态类型为什么慢呢?每次检查类型和改变类型开销太大;如此动态的类型,难以优化。

    2.2K30

    用最简单的方式在C#中使用多线程加速耗时的图像处理算法的执行(多核机器)。

    在单核时代,多线程程序的主要目的是防止UI假死,而一般情况下此时多线程程序的性能会比单线程的慢,这种情况五六年前是比较普遍的,所有哪个时候用VB6写的图像程序可能比VC6的慢不了多少。...可在多核时代,多线程的合理利用可以使得程序速度线性提升。      在一般的编程工具中,都有提供线程操作的相关类。...但是直接的使用Threading类还是很不方便,为此,在C#的几个后续版本中,加入了Parallel这样的并行计算类,在实际的编码中,配合Partitioner.Create方法,我们会发现这个类特别适合于图像处理中的并行计算...同时,我们选择对一副大点的图像,比如上述的4000*3000的图像进行缩放魔术,观察CPU的使用情况,如上图所示,4个核都是在慢复核工作,可见PS也是使用了多线程进行处理。     ...C#中多线程比PS的快,并不能完全说明PS做的不够好,那是因为可能一个是算法不完全一致,二是PS还需要做其他的一些处理。

    4.2K60

    为什么Python这么慢?

    我想要回答这样一个问题:当运行同一个程序时,为什么Python会 比其他语言慢2到10倍?为什么我们无法将它变得更快?...如果你之前没有做过多线程编程,你需要快速熟悉锁的概念。区别于单线程进程,你需要确保当内存中的变量被修改时,多线程不会同时试图访问或者改变同一个存储地址。...PyPy拥有GIL,通常比CPython快至少三倍。 Jython没有GIL,因为在Jython中Python线程是用Java线程表示的,这得益于JVM内存管理系统。...那么,如果Python用的是和Java和C#一样的虚拟机和某种字节代码,为什么在基准测试中它却慢得多?首先,.NET和Java是采用JIT编译的。...CPython启动时间已经相对较慢,PyPy比CPython还要慢2-3倍。众所周知,Java虚拟机的启动速度很慢。

    1.1K40

    【Redis破障之路】三:Redis单线程架构

    1.3、为什么单线程还能这么快 通常来讲,单线程处理能力要比多线程差,那么为什么Redis使用单线程模型会达到每秒万级别的处理能力呢?...第三:单线程避免了线程切换和竞态产生的消耗。 我们继续来看Redis单线程却很快的最后一条原因,在多线程开发中,存在线程的切换和竞争,这样一来,是有时间的消耗的。...Redis的数据存放在内存中,将内存中的数据读入CPU时,CPU不是依然需要等待吗,为什么不能在等待数据从内存读入CPU期间执行其他线程,以此提高CPU的使用率呢?...这个问题的答案很简单,内存的读些速度虽然比CPU慢很多,但是也是非常快的。...如果某个命令执行过长,会造成其他命令的阻塞,对于Redis这种高性能的服务来说是致命的,所以Redis是面向快速执行场景的数据库。 2、支持多线程的Redis6.0 “Redis不是单线程吗?

    77430

    热度碾压 Java、C#、C++的 Python,为什么速度那么慢?

    作者:Anthony Shaw 译者:弯月,责编:屠敏 本文经授权转自公众号CSDN(ID: CSDNnews),转载需授权 同为程序员的心头好,Python 为什么能这么慢?...我希望回答以下问题:如果 Python 完成相同的任务要花费其他语言二至十倍的时间,那么它为什么慢,能不能更快一些呢?...如果你没写过多线程程序,那么你应该了解一下锁的概念。与单线程进程不同,在多线程编程中,你要确保改变内存中的变量时,多个线程不会试图同时修改或访问同一个内存地址。...CPython 在创建变量时会分配内存,然后用一个计数器计算对该变量的引用的次数。这个概念叫做“引用计数”。如果引用的数目为 0,那就可以将这个变量从系统中释放掉。...那么,既然它们都使用虚拟机,以及某种字节码,为什么Python在性能测试中比Java和C#慢那么多?第一个原因是,.NET和Java是即时编译的(JIT)。

    2.2K10

    109道Redis面试题,年后面试无忧!

    Redis已经成为一个Java开发必备的技能之一了,所以,在面试中占比依旧很高,为了让你在面试中能更加得心应手,我给你准备了109道Redis面试题。...为什么 Redis 需要把所有数据放到内存中? Redis 是多线程还是单线程? Redis6.0 之后为何引入了多线程? Redis 为什么设计成单线程的?...简单说说Redis单线程原理 Redis是单线程还是多线程?Redis为什么这么快? 什么是缓存穿透?怎么解决? 用分布式缓存,要注意哪些问题? 什么是缓存雪崩?怎么解决? 缓存的更新策略有几种?...为什么? Redis慢查询是什么?通过什么配置? Redis 的慢查询修复经验有哪些?怎么修复的? 有做过Redis 服务的性能优化过吗? 说一下Redis 的主从复制模式的优缺点?...Redis 中 key已经过期了,但为什么内存并没有释放? 你说说Redis中的跳表 说说你对 Redis中的I/O多路复用模型 的理解 Redis是单线程还是多线程?

    46330

    面试官:让我看看你的Redis功力如何

    2、为什么Redis单线程模型效率也能那么高? 首先,Redis使用了高度优化的数据结构和算法,比如跳跃表、压缩列表,在访问速度上进行了优化提升了性能。...其次,单线程避免了多线程中常见的上下文切换问题,减少了资源开销,专注干活。 另外,Redis使用了事件驱动的非阻塞IO机制,这意味着Redis能够在等待数据IO时不会阻塞主线程。...而AOF以日志的形式追加到文件中,只会丢失最后一次的写操作数据,AOF数据安全性较高。也正是因为AOF会把所有的写操作记录下来,所以在重启恢复数据时会执行所有的写操作,数据恢复速度比RDB慢。...9、Redis6.0为什么要引入多线程? Redis 6.0引入多线程的主要原因是为了解决网络IO的性能瓶颈。 传统的单线程模型在处理大量网络请求时,只能串行处理,无法充分利用多核CPU的性能。...所以,引入多线程主要是为了并行处理网络IO,命令执行仍然是单线程的。 10、如何在100个亿URL中快速判断某URL是否存在?

    26810

    好强一个Julia!CSV数据读取,性能最高多出R、Python 22倍

    单线程CSV.jl是没有多线程的Pandas(Python)的1.5倍,而多线程的CSV.jl可以达到11倍。 字符串数据集 I 此数据集在且具有1000k行和20列,并且所有列中不存在缺失值。 ?...单线程CSV.jl比data.table快2.5倍,而在10个线程中,CSV.jl则大约比data.table快14倍。 字符串数据集 II 该数据集的大小与字符串数据集 I 中相同。...单线程中,CSV.jl比R快1.2倍,而多线程相比,CSV.jl则快约5倍。 苹果股价数据集 该数据集包含50000k行和5列,大小为2.5GB。这些是AAPL股票的开盘价、最高价、最低价和收盘价。...单线程CSV.jl比从data.table中读取的R速度快约1.5倍。 而多线程,CSV.jl的速度提高了约22倍! Pandas的read_csv需要34秒才能读取,这比R和Julia都要慢。...可以看出,在所有八个数据集中,Julia的CSV.jl总是比Pandas快,并且在多线程的情况下,它与R的data.table互有竞争。

    2K63

    不懂这些,简历上都不敢写自己熟悉Redis

    我们按直觉来看应该是多线程比单线程更快、处理能力更强才对,比如单线程一次只可以做一件事情,而多线程却可以同时做十件事情。...但Redis却可以做到每秒万级别的处理能力,主要是基于以下原因: (1)Redis是基于内存操作的,Redis所有的数据库状态都保存在内存中。而内存的响应时长是非常快速的,大约在100纳秒。...(2)Redis采用I/O多路复用技术,这种I/O模型是非阻塞I/O,应用程序在等待I/O操作完成的过程中不需要阻塞。 (3)最后一点也是我开头提到的,Redis采用了单线程模型。...单线程模型避免了多线程产生的线程切换和锁竞争带来的资源消耗,这两种消耗对性能影响是很大的。另外一点是单线程相比多线程来说实现更简单高效,如果引入多线程设计相信Redis实现起来会更加复杂不易优化。...面试官:那有序集合为什么要使用字典和跳跃表?

    19598

    深入理解JVM - CMS收集器

    : 多线程回收器和单线程回收器那个好?...通常情况下,如果是服务端通常更加建议使用多线程收集器,而客户端则更加倾向使用单线程的收集器。因为如果是单核的机器使用多线程会带来额外的“上下文切换”的操作,性能不会提升反而会下降。...Jdk 中 「-xx:cmsInitiatingOccupactAtFullCollection」参数在 jdk5 是68% ,而jdk6 调整为 92%。...在实际使用过程中需要小心调整此比例,防止并发失败问题发生。 ❝可以看到Serial收集器作为兜底的操作,有人会有疑问为什么兜底用Serial这种单线程垃圾收集器而不用其他的垃圾收集器。...思考题:为什么老年代垃圾回收速度会比新生代慢这么多,到底慢在哪里? 首先老年代内存对象非常多,GC ROOT的速度是非常慢的,垃圾回收时间被拉长。

    53820

    Java多线程编程-(3)-从一个错误的双重校验锁代码谈一下volatile关键字

    那么问题来了,为什么volatile关键字可以实现禁止指令的重排序优化以及什么是指令重排序优化哪? 在Java内存模型中我们都是围绕着原子性、有序性和可见性进行讨论的。...指令重排序是JVM为了优化指令,提高程序运行效率,在不影响单线程程序执行结果的前提下,尽可能地提高并行度(比如:将多条指定并行执行或者是调整指令的执行顺序)。编译器、处理器也遵循这样一个目标。...注意是单线程。可显而知,多线程的情况下指令重排序就会给程序员带来问题。...因此,如何正确的使用双重校验锁,以及为什么使用关键字volatile这里我们应该很清楚了。 上述也提到了volatile关键字的另一个作用就是:变量在多个线程之间可见。...可以看出 在单线程的情况下,程序会一直执行下去,即一直执行while循环,导致程序不能正常执行下边的代码。解决的方法可以使用多线程。多线程示例代码如下: ? 执行结果如下: ?

    62820

    为什么有人说 Python 多线程是鸡肋?

    为什么有人会说 Python 多线程是鸡肋?知乎上有人提出这样一个问题,在我们常识中,多进程、多线程都是通过并发的方式充分利用硬件资源提高程序的运行效率,怎么在 Python 中反而成了鸡肋?...是什么原因导致多线程不快反慢的呢?...因此,这也就是为什么两个线程一起执行反而更加慢的原因,因为同一时刻,只有一个线程在运行,其它线程只能等待,即使是多核CPU,也没办法让多个线程「并行」地同时执行代码,只能是交替执行,因为多线程涉及到上线文切换...相比单线程,这些多是多线程带来的额外开销 CPython 解释器为什么要这样设计?...多线程在IO密集型任务中,表现又怎样呢?欢迎大家留言

    99460

    设计模式-单例模式

    学习了单例模式,自己记一下笔记,本文从一个单例模式开始进行一步一步的演进,使用c#语言,在实现上会结合C#的特性。...演进过程为 单线程无参数单例模式->多线程无参数单例模式->.net特性多线程无参数单例模式->单线程有参数单例模式->多线程有参数单例模式->.net特性多线程有参数单例模式 No.1 单线程无参数单例模式...下面我们在该函数内部进行实例化,进行判空如果对象没有被实例化就进行示例化,该单例模式只试用与单线程使用。为什么只能在单线程中使用?...) { Instance = new Singleton(); } private Singleton() { } } 在第一种方式中我们使用了内联初始化...,在.net中会将初始化内容放入构造器中初始化,因为是静态变量所以为静态初始化器所以如下面的代码。

    12310

    撸了个多线程断点续传下载器,我从中学习到了这些知识

    上面是下载阶段的文件一致性校验,那么在写入阶段呢?不管单线程还是多线程,由于要断点续传,在写入时都要在指定位置进行字符追加。在 Java 中有没有好的实现方式?...seek 方法还有很多妙用,比如使用它你可以快速定位到已知的位置,进行快速检索;也可以在同一个文件的不同位置进行并发读写。 多线程下载如何实现?...既然瓶颈在这里,为什么多线程下载可以提速呢?其实理论上来说,单线程下载就可以达到最大网速。但是往往事实是网络不是那么通畅,十分拥堵,很难达到理想的最大速度。...也就是说只有在网络不那么通畅的时候,多线程下载才能提速。否则,单线程即可。不过最大速度永远都是网络带宽。 那为什么多线程下载可以提速呢?...这时多线程的优势就体现出来了,因为你的多线程会让这个速度减速没有那么猛烈,毕竟这时可能有另一个线程正处在慢启动的在最终加速阶段,这样总体的下载速度就优于单线程了。

    94510

    Python Web学习笔记之GIL机制下的鸡肋多线程

    为什么有人会说 Python 多线程是鸡肋?知乎上有人提出这样一个问题,在我们常识中,多进程、多线程都是通过并发的方式充分利用硬件资源提高程序的运行效率,怎么在 Python 中反而成了鸡肋?...有同学可能知道答案,因为 Python 中臭名昭著的 GIL。 那么 GIL 是什么?为什么会有 GIL?多线程真的是鸡肋吗? GIL 可以去掉吗?...) cost = time.time() - start >>> 6.541690826416016 在我的4核 CPU 计算机中,单线程所花的时间是 6.5 秒。...因此,这也就是为什么两个线程一起执行反而更加慢的原因,因为同一时刻,只有一个线程在运行,其它线程只能等待,即使是多核CPU,也没办法让多个线程「并行」地同时执行代码,只能是交替执行,因为多线程涉及到上线文切换...相比单线程,这些多是多线程带来的额外开销。 CPython 解释器为什么要这样设计?

    60260

    Redis单线程已经很快了,为什么6.0要引入多线程?

    导读:为什么Redis单线程却能支撑高并发?Redis6.0之后为什么又引入多线程?...针对上面问题,Redis在4.0版本以及6.0版本分别引入了Lazy Free以及多线程IO,逐步向多线程过渡,下面将会做详细介绍。 单线程原理 都说Redis是单线程的,那么单线程是如何体现的?...为了解决这个问题,在Redis 4.0版本引入了Lazy Free,将慢操作异步化,这也是在事件处理上向多线程迈进了一步。...如作者在其博客中所述,要解决慢操作,可以采用渐进式处理,即增加一个时间事件,比如在删除一个具有上百万个对象的Set键时,每次只删除大键中的一部分数据,最终实现大键的删除。...下面看下异步删除,Redis在回收对象时,会先计算回收收益,只有回收收益在超过一定值时,采用封装成Job加入到异步处理队列中,否则直接同步回收,这样效率更高。

    70150
    领券