吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1558|回复: 16
收起左侧

[求助] 求大神解惑python提速,这是硬件问题还是代码问题?

[复制链接]
lizy169 发表于 2022-9-10 11:14
30吾爱币
for循环用了多种方式,做大数据计算的时候,实际用的时间都差不多,想提速,但不知道怎么办求吾爱大神解惑,这种情况是我硬件配置问题?还是代码问题?运行时,CPU只占15%,内存也没超过一半,系统win10_64位,编译器pycharm
代码思路1:普通for循环
[Python] 纯文本查看 复制代码
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循环
[Python] 纯文本查看 复制代码
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()方式,实际效果也不明显,还报错多
[Python] 纯文本查看 复制代码
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))))


最后用一个笨办法
[Python] 纯文本查看 复制代码
ret = list(range(1, 6)) 
A = [1, 2, 3]
B = [4, 5, 6]

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方法同时启动两个函数


效果还是一样的,几种方式运行的时间都差不多,求万能的吾爱大神指点,谢谢!

最佳答案

查看完整内容

由于python中存在GIL的原因,多线程是伪多线程,可以尝试多进程方式,但效果也有限。 另外可以使用JIT的方式,如用numba加速,使用上很简单如下,可以获得几倍至几百倍的加速, 如果你有显卡的话,还可以直接通过CUDA运算,加速更是明显,另外国产Taichi也提供类似的加速功能 ...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

adesun 发表于 2022-9-10 11:14
本帖最后由 adesun 于 2022-9-10 13:38 编辑

由于python中存在GIL的原因,多线程是伪多线程,可以尝试多进程方式,但效果也有限。
另外可以使用JIT的方式,如用numba加速,使用上很简单如下,可以获得几倍至几百倍的加速,
如果你有显卡的话,还可以直接通过CUDA运算,加速更是明显,另外国产Taichi也提供类似的加速功能

[Python] 纯文本查看 复制代码
from numba import jit

@jit
def f(x, y):
    # A somewhat trivial example
    return x + y



免费评分

参与人数 1吾爱币 +1 收起 理由
lizy169 + 1 谢谢@Thanks!

查看全部评分

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

实际运算的时候,我导入的一个csv有500多M,运行时间差不多8分钟左右,我用上面这些方法,用时都差不多,我想让它快一点,最好一两分钟就能完成,当然越快越好
白云点缀的蓝 发表于 2022-9-10 11:31
 楼主| 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设置问题吗 ...

断电重启试试
anonymuser 发表于 2022-9-10 11:47
Python 是伪多线程,只能多进程来实现

免费评分

参与人数 1热心值 +1 收起 理由
lizy169 + 1 谢谢@Thanks!

查看全部评分

netspirit 发表于 2022-9-10 12:20
你的for什么的基础命令用不了多少时间 如果要节约时间你还是要看别人的库是怎么写的 多数时间都花在了执行库的命令上面了

免费评分

参与人数 1吾爱币 +1 收起 理由
lizy169 + 1 谢谢@Thanks!

查看全部评分

平淡最真 发表于 2022-9-10 12:34
有些程序多线程并提不了速,要看具体情况

https://m.baidu.com/sf?pd=topone ... 0983%22%7D&top={%22sfhs%22:1}&atn=index&lid=11827956999960958353

免费评分

参与人数 1吾爱币 +1 收起 理由
lizy169 + 1 谢谢@Thanks!

查看全部评分

hrpzcf 发表于 2022-9-10 12:37
如果调用的库是单线程的,那对于处理单个文件来说,你代码用多线程或多进程都是提不了速的。对于处理多个文件,你可以通过多线程或多进程同时处理多个文件,这对于你来说也是提速了,但是它处理单个文件的速度还是没变。

免费评分

参与人数 1吾爱币 +1 收起 理由
lizy169 + 1 谢谢@Thanks!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 08:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表