是否可以将Python程序转换为C/C++?
我需要实现几个算法,我不知道,如果性能差距大到足以证明所有的痛苦在C/C++(这我不擅长)做的时候我会去.我考虑过编写一个简单的算法,并针对这样一个转换后的解决方案进 如果仅这一点明显快于Python版本,那么除了在C/C++中做这件事之外我别无选择.
我先研究过,找不到我的问题的答案.我试图在Python中并行运行多个函数.
我有这样的事情:
files.py
import common #common is a util class that handles all the IO stuff
dir1 = 'C:\folder1'
dir2 = 'C:\folder2'
filename = 'test.txt'
addFiles = [25, 5, 15, 35, 45, 25, 5, 15, 35, 45]
def func1():
c = common.Common()
for i in range(len(addFiles)):
c.createFiles(addFiles[i], filename, dir1)
c.getFiles(dir1)
time.sleep(10)
c.removeFiles(addFiles[i], dir1)
c.getFiles(dir1)
def func2():
c = common.Common()
for i in range(len(addFiles)):
c.createFiles(addFiles[i], filename, dir2)
c.getFiles(dir2)
time.sleep(10)
c.removeFiles(addFiles[i], dir2)
c.getFiles(dir2)
Run Code Online (Sandbox Code Playgroud)
我想调用func1和func2并让它们同时运行.这些函数不会相互交互或在同一个对象上交互.现在我必须等待func1在func2启动之前完成.我如何做以下事情:
process.py
from files import func1, func2
runBothFunc(func1(), func2()) …Run Code Online (Sandbox Code Playgroud) 我正在为python寻找一个简单的基于进程的并行映射,即一个函数
parmap(function,[data])
Run Code Online (Sandbox Code Playgroud)
这将在不同进程上的[data]的每个元素上运行函数(好吧,在不同的核心上,但是AFAIK,在python中在不同核心上运行东西的唯一方法是启动多个解释器),并返回结果列表.
这样的事情存在吗?我想要一些简单的东西,所以一个简单的模块会很好.当然,如果不存在这样的事情,我会选择一个大型图书馆: - /
我正在寻找一个确定的答案MATLAB的parfor for Python(Scipy,Numpy).
有没有类似于parfor的解决方案?如果没有,创建一个的复杂性是什么?
更新:这是我需要加速的典型数值计算代码
import numpy as np
N = 2000
output = np.zeros([N,N])
for i in range(N):
for j in range(N):
output[i,j] = HeavyComputationThatIsThreadSafe(i,j)
Run Code Online (Sandbox Code Playgroud)
重计算函数的一个例子是:
import scipy.optimize
def HeavyComputationThatIsThreadSafe(i,j):
n = i * j
return scipy.optimize.anneal(lambda x: np.sum((x-np.arange(n)**2)), np.random.random((n,1)))[0][0,0]
Run Code Online (Sandbox Code Playgroud) 我试图让2个函数同时运行.
def func1():
print 'Working'
def func2():
print 'Working'
func1()
func2()
Run Code Online (Sandbox Code Playgroud)
有谁知道如何做到这一点?
什么是在python 2.7中进行并行处理的简单代码?我在网上找到的所有例子都很复杂,包括不必要的代码.
我怎么做一个简单的强力整数分解程序,我可以在每个核心(4)上计算1个整数?我的真实程序可能只需要2个核心,并且需要共享信息.
我知道parallel-python和其他库存在,但我想将库的数量保持在最低限度,因此我想使用thread和/或multiprocessing库,因为它们带有python
所以我刚刚在Python全局解释器锁(GIL)http://blip.tv/file/2232410上看完了这个演讲.
它的要点是GIL对于单核系统来说是一个非常好的设计(Python实际上将线程处理/调度留给了操作系统).但是,这可能严重地适应多核系统,最终导致IO密集型线程被CPU密集型线程严重阻塞,上下文切换费用,ctrl-C问题[*]等等.
因此,由于GIL限制我们基本上在一个CPU上执行Python程序,我的想法是为什么不接受这个并简单地在Linux上使用taskset来设置程序与系统上某个核心/ cpu的亲和性(特别是在某种情况下)在多核系统上运行的多个Python应用程序)?
所以最终我的问题是:有没有人尝试在Linux上使用带有Python应用程序的任务集(特别是在Linux系统上运行多个应用程序,以便多个核心可以与一个或两个绑定到特定核心的Python应用程序一起使用),如果是这样的话是结果?值得做吗?是否会使某些工作负载更糟糕?我打算这样做并进行测试(基本上看看程序是否需要花费更多或更少的时间来运行),但我很乐意听取其他人的经验.
另外:David Beazley(在链接视频中发表演讲的人)指出,一些C/C++扩展手动释放GIL锁,如果这些扩展针对多核进行优化(即科学或数字数据分析/等),那么而不是为数字运算获得多核的好处,扩展将被有效地削弱,因为它仅限于单个核心(因此可能显着降低程序速度).另一方面,如果您没有使用此类扩展
我没有使用多处理模块的原因是(在这种情况下)程序的一部分是严重的网络I/O绑定(HTTP请求),所以有一个工作线程池是一个很好的方式从一个盒子挤出性能一个线程触发一个HTTP请求,然后因为它在I/O上等待就放弃了GIL而另一个线程可以做到这一点,所以程序的一部分可以轻松地运行100多个线程而不会伤害CPU太多让我实际使用可用的网络带宽.对于无堆栈的Python/etc,我对重写程序或替换我的Python堆栈并不过分感兴趣(可用性也是一个问题).
[*]只有主线程可以接收信号,所以如果你发送一个ctrl-C,Python解释器基本上试图让主线程运行,这样它就可以处理信号,但因为它不能直接控制运行哪个线程(它留给操作系统)它基本上告诉操作系统继续切换线程,直到它最终命中主线程(如果你不幸,可能需要一段时间).
我试图在Python中同时运行两个函数.我尝试了下面的代码,multiprocessing但是当我执行代码时,第二个函数只在第一个函数完成后启动.
from multiprocessing import Process
def func1:
#does something
def func2:
#does something
if __name__=='__main__':
p1 = Process(target = func1)
p1.start()
p2 = Process(target = func2)
p2.start()
Run Code Online (Sandbox Code Playgroud) 我的项目是使用OpenMP在C中做一些并行的算法.现在我想用Python做同样的项目.有没有类似于openmp for python的东西?
我有一个df交易者交易数据集。我有 2 个级别的 for 循环,如下所示:
smartTrader =[]
for asset in range(len(Assets)):
df = df[df['Assets'] == asset]
# I have some more calculations here
for trader in range(len(df['TraderID'])):
# I have some calculations here, If trader is successful, I add his ID
# to the list as follows
smartTrader.append(df['TraderID'][trader])
# some more calculations here which are related to the first for loop.
Run Code Online (Sandbox Code Playgroud)
我想并行化 中每个资产的计算Assets,并且我还想并行化每个资产的每个交易者的计算。完成所有这些计算后,我想根据smartTrader.
这是我第一次尝试并行处理,所以请耐心等待,非常感谢您的帮助。
我还处于 Python 学习的早期阶段。如果这个问题听起来很愚蠢,请提前道歉。
我有这组数据(表格格式),我想向其中添加几个计算列。基本上我有一些位置 lon/lat 和目的地 lon/lat,以及各自的数据时间,我正在计算每对之间的平均速度。
示例数据如下所示:
print(data_all.head(3))
id lon_evnt lat_evnt event_time \
0 1 -179.942833 41.012467 2017-12-13 21:17:54
1 2 -177.552817 41.416400 2017-12-14 03:16:00
2 3 -175.096567 41.403650 2017-12-14 09:14:06
dest_data_generate_time lat_dest lon_dest \
0 2017-12-13 22:33:37.980 37.798599 -121.292193
1 2017-12-14 04:33:44.393 37.798599 -121.292193
2 2017-12-14 10:33:51.629 37.798599 -121.292193
address_fields_dest \
0 {'address': 'Nestle Way', 'city': 'Lathrop...
1 {'address': 'Nestle Way', 'city': 'Lathrop...
2 {'address': 'Nestle Way', 'city': 'Lathrop...
Run Code Online (Sandbox Code Playgroud)
然后我将 lon/lat 压缩在一起:
data_all['ping_location'] = list(zip(data_all.lon_evnt, data_all.lat_evnt))
data_all['destination'] = …Run Code Online (Sandbox Code Playgroud) 我按照本教程构建了一个非常简单的Telegram机器人.所以我有一个包含Python代码的文件,当我运行该代码时,机器人将回应我说的话.
机器人只有在我打开Python并运行代码时才能正常工作吗?这是否意味着我不能同时在Python中运行任何其他脚本,如果我希望我的机器人继续工作,也不能关闭Python?
有没有办法绕过这个,所以机器人将永远"开启"?
我有一个包含数百万数据的数据帧.假设这是名为的数据帧mydataframe:
filename | #insert-1 | #insert-2 | #delete-1 | #delete-2
---------------------------------------------------------
A | 4 | 4 | 3 | 3
B | 3 | 5 | 2 | 2
C | 5 | 5 | 6 | 7
D | 2 | 2 | 3 | 3
E | 4 | 5 | 5 | 3
---------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我需要根据插入或删除的不同数量来分离文件,然后将它们保存到新CSV文件中,命名为different.csv.并且还在CSV名为的单独文件中保存具有相同插入和删除数量的其余数据same.csv.在换句话说,如果该文件之间具有不同数目的#insert-1和#insert-2,或#delete-1和#delete-2然后将其保存在different.csv,否则,将其保存在same.csv. …