求大神解惑python提速,这是硬件问题还是代码问题?
for循环用了多种方式,做大数据计算的时候,实际用的时间都差不多,想提速,但不知道怎么办求吾爱大神解惑,这种情况是我硬件配置问题?还是代码问题?运行时,CPU只占15%,内存也没超过一半,系统win10_64位,编译器pycharm代码思路1:普通for循环
def data_function1():# 数据计算方式1-for循环
start = time.perf_counter_ns()
for i in ret:
# print(i)
if i == 5:
print(i)
end = time.perf_counter_ns()
print('for循环耗时:{}'.format(str(round(end - start, 2))))
data_function1()
代码思路2:多线程代替for循环
import time
from multiprocessing.dummy import Pool
ret = list(range(1, 6))# 数据2
def process(x):# 代替for循环,数据计算方式2函数主体
# print(x)
if x == 5:
print(x)
def data_function2():# 计算方式2-多线程代替for循环
start = time.perf_counter_ns()
pool = Pool()
pool.map(process, ret)
pool.close()
pool.join()
end = time.perf_counter_ns()
print('多线程耗时:{}'.format(str(round(end - start, 2))))
用@na.jit()方式,实际效果也不明显,还报错多
import time
from multiprocessing.dummy import Pool
import numba as na
ret = list(range(1, 6))# 数据2
@na.jit()# 自动进行并行计算(nopython=True, parallel=True)
def data_function3():# 数据计算方式3-for循环+jit
start = time.perf_counter()
for i in ret:
# print(i)
if i == 5:
print(i)
end = time.perf_counter()
print('for循环jit耗时:{}'.format(str(round(end - start, 2))))
最后用一个笨办法
ret = list(range(1, 6))
A =
B =
def data_A():# 数据计算方式1-for循环
start = time.perf_counter_ns()
for i in A:
# print(i)
if i == 5:
print(i)
end = time.perf_counter_ns()
print('for循环耗时:{}'.format(str(round(end - start, 2))))
def data_B():# 数据计算方式1-for循环
start = time.perf_counter_ns()
for i in B:
# print(i)
if i == 5:
print(i)
end = time.perf_counter_ns()
print('for循环耗时:{}'.format(str(round(end - start, 2))))
# 将原列表分成两部分,分别代入两个函数,用threading方法同时启动两个函数
效果还是一样的,几种方式运行的时间都差不多,求万能的吾爱大神指点,谢谢!
本帖最后由 adesun 于 2022-9-10 13:38 编辑
由于python中存在GIL的原因,多线程是伪多线程,可以尝试多进程方式,但效果也有限。
另外可以使用JIT的方式,如用numba加速,使用上很简单如下,可以获得几倍至几百倍的加速,
如果你有显卡的话,还可以直接通过CUDA运算,加速更是明显,另外国产Taichi也提供类似的加速功能
from numba import jit
@jit
def f(x, y):
# A somewhat trivial example
return x + y
hecoter 发表于 2022-9-10 11:19
数据量太少,没有效果,还可能导致降速
实际运算的时候,我导入的一个csv有500多M,运行时间差不多8分钟左右,我用上面这些方法,用时都差不多,我想让它快一点,最好一两分钟就能完成,当然越快越好 硬件问题吧,这东西是基于硬件的{:17_1065:}{:17_1065:} 白云点缀的蓝 发表于 2022-9-10 11:31
硬件问题吧,这东西是基于硬件的
我运行的时候,查看电脑的任务管理器,CPU最多也才占到15%,内存一半都没有占完,是我pycharm设置问题吗?该怎样设置?
谢谢! lizy169 发表于 2022-9-10 11:38
我运行的时候,查看电脑的任务管理器,CPU最多也才占到15%,内存一半都没有占完,是我pycharm设置问题吗 ...
断电重启试试{:17_1065:}{:17_1065:} Python 是伪多线程,只能多进程来实现 你的for什么的基础命令用不了多少时间 如果要节约时间你还是要看别人的库是怎么写的 多数时间都花在了执行库的命令上面了 有些程序多线程并提不了速,要看具体情况
https://m.baidu.com/sf?pd=topone_trustpaper&resource_id=55858&word=CPU%E5%AF%86%E9%9B%86%E4%B8%8EIO%E5%AF%86%E9%9B%86%E5%9E%8B%E5%8C%BA%E5%88%AB+&ext=%7B%22url%22%3A%22https%3A%5C%2F%5C%2Fwww.cnblogs.com%5C%2Fming-blogs%5C%2Fp%5C%2F10897242.html%22%2C%22srcid%22%3A%2228420%22%2C%22jumptype%22%3A%22text%22%2C%22urlsign%22%3A%221184391322349539351%22%2C%22sitesign%22%3A%223808684077109539611%22%2C%22query%22%3A%22cpu%5Cu5bc6%5Cu96c6%5Cu578b%5Cu548cio%5Cu5bc6%5Cu96c6%5Cu578b%5Cu533a%5Cu522b%22%2C%22token%22%3A%2260ddf5%22%2C%22eid%22%3A%2290983%22%7D&top={%22sfhs%22:1}&atn=index&lid=11827956999960958353 如果调用的库是单线程的,那对于处理单个文件来说,你代码用多线程或多进程都是提不了速的。对于处理多个文件,你可以通过多线程或多进程同时处理多个文件,这对于你来说也是提速了,但是它处理单个文件的速度还是没变。
页:
[1]
2