lizy169 发表于 2022-9-10 11:14

求大神解惑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 11:14

本帖最后由 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


lizy169 发表于 2022-9-10 11:23

hecoter 发表于 2022-9-10 11:19
数据量太少,没有效果,还可能导致降速

实际运算的时候,我导入的一个csv有500多M,运行时间差不多8分钟左右,我用上面这些方法,用时都差不多,我想让它快一点,最好一两分钟就能完成,当然越快越好

白云点缀的蓝 发表于 2022-9-10 11:31

硬件问题吧,这东西是基于硬件的{:17_1065:}{:17_1065:}

lizy169 发表于 2022-9-10 11:38

白云点缀的蓝 发表于 2022-9-10 11:31
硬件问题吧,这东西是基于硬件的

我运行的时候,查看电脑的任务管理器,CPU最多也才占到15%,内存一半都没有占完,是我pycharm设置问题吗?该怎样设置?
谢谢!

白云点缀的蓝 发表于 2022-9-10 11:41

lizy169 发表于 2022-9-10 11:38
我运行的时候,查看电脑的任务管理器,CPU最多也才占到15%,内存一半都没有占完,是我pycharm设置问题吗 ...

断电重启试试{:17_1065:}{:17_1065:}

anonymuser 发表于 2022-9-10 11:47

Python 是伪多线程,只能多进程来实现

netspirit 发表于 2022-9-10 12:20

你的for什么的基础命令用不了多少时间 如果要节约时间你还是要看别人的库是怎么写的 多数时间都花在了执行库的命令上面了

平淡最真 发表于 2022-9-10 12:34

有些程序多线程并提不了速,要看具体情况

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

hrpzcf 发表于 2022-9-10 12:37

如果调用的库是单线程的,那对于处理单个文件来说,你代码用多线程或多进程都是提不了速的。对于处理多个文件,你可以通过多线程或多进程同时处理多个文件,这对于你来说也是提速了,但是它处理单个文件的速度还是没变。
页: [1] 2
查看完整版本: 求大神解惑python提速,这是硬件问题还是代码问题?