专业编程基础技术教程

网站首页 > 基础教程 正文

python技巧 - 使用Numpy进行数值计算的神速度

ccvgpt 2025-02-06 14:12:21 基础教程 2 ℃

python和其他编程语言相比,运行速度相对慢,已是业内公认的事实,但是提高python代码的运行速度也是有些办法的。例如,python代码中如果使用循环结构处理数据,那提供循环操作数据的速度就尤为重要。首先要说明,以下介绍的方法适合代码存储数据和执行过程中消耗的内存比较少的情况,不适合处理大数据集

假定写一段代码,计算1到100000000的和。一般就会想到使用一个循环结构,做累加计算,那先看看这种方法会耗费多长时间?代码如下:

python技巧 - 使用Numpy进行数值计算的神速度

(1)一般的循环累加方法

import time
start = time.time()

total_sum = 0
for i in range(100000000):
    total_sum += i

print(f'自然数 1 到 100000000的和 : {total_sum}')
print(f'循环累加耗时: {round((time.time() - start),2)} 秒')

输出结果:

自然数 1 到 100000000的和 : 4999999950000000
循环累加耗时: 10.95 秒

下面对这种方法进行改进,

(2)使用内置函数,执行速度会较快

使用sum()函数,看看耗时多长,

import time
start = time.time()

total_sum = sum(range(100000000))

print(f'自然数 1 到 100000000的和 : {total_sum}')
print(f'循环累加耗时: {round((time.time() - start),2)} 秒')

输出结果:

自然数 1 到 100000000的和 : 4999999950000000
循环累加耗时: 3.11 秒

可以看出,第2种方法的执行速度比第1种提高了3倍,效果还是很明显的。

(3)使用Numpy中的sum()函数

import time
import numpy as np
start = time.time()

total_sum = np.sum(np.arange(100000000))

print(f'自然数 1 到 100000000的和 : {total_sum}')
print(f'循环累加耗时: {round((time.time() - start),2)} 秒')

输出结果:

自然数 1 到 100000000的和 : 887459712
循环累加耗时: 0.26 秒

可以看出,第3种方法使用了Numpy中的sum()函数,执行速度比第2种提高了将近12倍!因为numpy中sum()函数使用了向量运算。

对循环结构和numpy做进一步的计算测试

先看使用循环结构的一段代码,

import time
import numpy as np

random_scores = np.random.randint(1, 100, size=100000010)

start = time.time()

count_failed = 0
sum_failed = 0
for score in random_scores:
    if score < 70:
        sum_failed += score
        count_failed += 1

print(sum_failed/count_failed)
print(f'循环计算耗时:{round((time.time() - start),2)} 秒')

输出结果:

C:\Users\Administrator\AppData\Local\Temp/ipykernel_9176/873841749.py:12: RuntimeWarning: overflow encountered in long_scalars
  sum_failed += score
-26.627642432051644
循环计算耗时:32.16 秒

注意:执行这段代码与电脑硬件有关。执行过程中,出现数据标量外溢,耗时就不对了,因为代码没有完整地执行;如果把 score < 70 调整为 score < 50,在我的电脑上就可以完整地执行这段代码,并输出结果(24.99998391881409,循环计算耗时:29.61 秒)。

下面看看同样的代码,使用Numpy处理的结果是什么样子?

import time
import numpy as np

random_scores = np.random.randint(1, 100, size=100000010)

start = time.time()

mean_failed = (random_scores[random_scores < 70]).mean()
print(mean_failed)

print(f'使用Numpy计算耗时: {round((time.time() - start),2)} 秒')

输出结果:

35.00054290510662
使用Numpy计算耗时: 0.79 秒

速度非常快!和前面使用循环结构的计算方法相比,不仅能够完整地执行代码,而且速度提高了10多倍,这种执行速度的改进效果显而易见。

最近发表
标签列表