Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pypy可能比默认编译器慢的可能原因_Python_Pandas_Numpy_Multiprocessing_Pypy - Fatal编程技术网

Python pypy可能比默认编译器慢的可能原因

Python pypy可能比默认编译器慢的可能原因,python,pandas,numpy,multiprocessing,pypy,Python,Pandas,Numpy,Multiprocessing,Pypy,我正在为学校做这个项目,我应该让脚本运行得更快,因为它非常慢。在过去的几个月里,由于我无法访问实际的脚本,我正在测试一个由我编写的虚拟脚本,它执行相同的任务。为此,我发现pypy与多处理一起使我的脚本运行速度至少提高了10倍。因此,在访问实际脚本时,我对它应用了多处理,并使用pypy运行它。然而,令人惊讶的是,使用pypy运行的代码比不使用pypy运行的代码慢2倍,而没有显示任何性能改进。原因可能是什么?实际脚本使用numpy、pandas等库,并通过数据库连接将输出写入web服务器稍后访问的进

我正在为学校做这个项目,我应该让脚本运行得更快,因为它非常慢。在过去的几个月里,由于我无法访问实际的脚本,我正在测试一个由我编写的虚拟脚本,它执行相同的任务。为此,我发现pypy与多处理一起使我的脚本运行速度至少提高了10倍。因此,在访问实际脚本时,我对它应用了多处理,并使用pypy运行它。然而,令人惊讶的是,使用pypy运行的代码比不使用pypy运行的代码慢2倍,而没有显示任何性能改进。原因可能是什么?实际脚本使用numpy、pandas等库,并通过数据库连接将输出写入web服务器稍后访问的进程。与pypy相比,numpy或pandas在常规编译器中的编译速度更快吗?如果没有,还有什么可以解释这一点?此外,还欢迎您提出任何加快速度的建议:)

p.S多处理已经被应用,它只比原始代码快40秒左右,这是不够的

编辑:在代码中添加 这是一个脚本,用于为医院生成谁与谁接触了多长时间以及在哪里进行的联系人跟踪。 基本上,它应该做的是,它读取一个csv文件,其中包含传感器在不同时间的所有位置,然后有一个算法生成所有联系人,并将其写入数据库,稍后由web服务器拾取

代码如下。它非常长,可能是我没有早点发布的原因:)

def重新采样数据(_beacondence,_timeInterval,_locationPtsX,_locationPtsY,数据库):

def Process2(已连接的EV、temp、devicelist、increment、patientlist、beaconData、start、end、devlist、scale、database、user、distance):

对于numPatients,枚举中的patientName(\u patientlist):
timestamp=_beaconData.loc[patientName,:].index.tolist()
patientX=\u beaconData.loc[patientName,‘Beacon Longtudity’]。tolist()
patientY=_beaconData.loc[patientName,'Beacon Latitude'].tolist()
progressUnit=(55/len(时间戳))
对于t,枚举中的timeNum(时间戳):
如果timeNum>=\u开始和timeNum

实际脚本使用numpy、pandas等库,并进行数据库连接

如果您的大部分时间都花在numpy、pandas和数据库调用上,而不是花在Python循环或计算上,那么PyPy几乎没有什么可以加快的

两个NUMPY和熊猫都是用C编写的扩展模块(带有C++、FORTRAN和汇编的一部分),大多数数据库库都是这样的。扩展模块在安装时编译为本机代码。无论是哪种解释器驱动,本机代码都将完全相同地运行。特别是,在PyPy中,它不会经历任何类型的JIT。*因此,除非您在某处有一些重要的Python计算,否则PyPy无法使任何事情更快

同时,PyPy实际上可以让事情变慢。CPython可以直接访问C-API扩展,比如numpy,但是PyPy必须假装是CPython才能与扩展代码通信,这是通过一个名为CPyExt的包装器实现的。PyPy中的OnNumpy说,CPyExt“速度非常慢”。这有点不公平/自嘲,尤其是在他们过去5年投入了这么多精力之后;对于许多numpy程序,您甚至不会注意到差异。但仍有一些情况下,你会。您提到了多处理,许多情况涉及跨进程共享阵列

偶尔,使用
numpy
fork(以PyPy友好的方式重新实现numpy的核心)是值得的。从2018年起,这是一个不推荐的解决方案(最后一点不完整的部分可能永远不会完成),但如果出于某种原因,您真的需要同时使用numpy和PyPy,并且您遇到了其中一个缓慢的领域,那么这仍然是一个选项



*如果您需要JIT数字代码,Jython或IronPython可以与JVM或.NET运行时的数字库一起使用,后者确实通过JIT运行。然而,我不知道在大多数用例中有哪一个能像numpy一样快。同时,您可能希望在CPython中使用numpy查看
numba
,它通常可以JIT您编写的包装器代码,以比PyPy更好地驱动您的numpy工作。

可能重复“实际脚本使用numpy之类的库…”第一个问题:您是否使用
numpy
,或者使用标准
numpy
并使PyPy适应它?您要求我们根据模糊、不清楚的问题描述推测我们看不到的代码行为。不是这个网站的工作方式。花些时间阅读和阅读网页,尤其是和。这个网站不是用来提问的。请提供一个列表,列出在我不打算向您展示的代码中可能出现问题的数百万个原因。更一般地说,在(编写良好的)numpy代码中,实际的Python计算非常少,numpy中发生了大量的事情。PyPy无法加速numpy内部发生的事情。同时,允许PyPy使用C扩展(如numpy)的
cpyext
包装器是。虽然他们在过去几年中做了一些伟大的工作来优化它,但通过多处理和cpyext在两侧共享阵列是一个通常仍然缓慢的领域。恐怕这根本不会影响本网站的指导方针。他们不会说,除非你提出一些理由,解释为什么他们不适用于你。进一步阅读代码,我意识到它不会在这些库中花费很多时间。事实上,有大量的计算在进行,嵌套for循环,我希望pypy能够加快计算速度。我甚至没有看到他显式地使用numpy。只有熊猫在重采样数据函数中。@t
database.child("contact").child("progress").set(20)
beaconData = pd.DataFrame({'timestamp': _timeInterval, 'Device': _beaconDevice, 'Beacon Longtitude': _locationPtsX, 'Beacon Latitude': _locationPtsY})
beaconData.set_index('timestamp', inplace=True)
beaconData.index = pd.to_datetime(beaconData.index)
beaconData = beaconData.groupby('Device').resample('S')['Beacon Longtitude', 'Beacon Latitude'].mean().ffill()
return beaconData
for numPatients, patientName in enumerate(_patientlist):
    timestamp = _beaconData.loc[patientName, :].index.tolist()
    patientX = _beaconData.loc[patientName, 'Beacon Longtitude'].tolist()
    patientY = _beaconData.loc[patientName, 'Beacon Latitude'].tolist()
    progressUnit = (55/len(timestamp))
    for t, timeNum in enumerate(timestamp):
        if timeNum >= _start and timeNum <= _end:
            for device, devNum in enumerate(_devlist):
                if devNum != patientName:
                    if devNum in devicelist:
                        logger.log ("Finding Contacts...", timeNum)
                        if increment<55:
                            increment += progressUnit
                            try:
                                database.child("contact").child("progress").set(30+increment)
                            except: logger.info("exception")
                        isContact, contactLoc = inContact(patientName, patientX, patientY, devNum, t, _beaconData, _scale, _distance)
                        if isContact==True:
                            logger.log (patientName, "in contact with", devNum, "!")
                            temp.append(patientName)
                            temp.append(timeNum)
                            temp.append(int(devNum))
                            temp.append(patientX[t])
                            temp.append(patientY[t])
                            temp.append(contactLoc[0])
                            temp.append(contactLoc[1])
                            connectedDev.append(temp)
                            temp = []