python for循环,列表推导、numpy三者的运算速度对比

本文对比了在Python中使用for循环、列表推导式和numpy进行数据计算的效率,实验使用sklearn的美国加州房价数据集,结果显示numpy计算速度远超其他两种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

	在Python中,我们要尽量的对数据计算选择使用numpy格式,
	不要过得使用for,for循环计算效率很低,一般情况下,列表推导的计算速度介于两者之间。

	这里我将三者做一个对比,所做的案例就是将矩阵上的每个元素,
	在原来数值的基础上都加上1。这是一个简单的操作,对比一下,每种方法所花的计算的时间。

这里就是使用sklearn的美国加州房价的数据集的特征X作为我们的矩阵数据集。

import pandas as pd 
from sklearn.datasets import fetch_california_housing
HOUSE  = fetch_california_housing() 
X = HOUSE.data

这里的特征矩阵X是一个 20640行8列的数据集,类型为ndnarray

  1. 使用for循环
%%time
RES = [] 
for i in range(X.shape[0]):
    res = [] 
    for j in range(X.shape[1]):
        res.append(X[i,j]+1) 
    RES.append(res) 
pd.DataFrame(RES).head(3)  

在这里插入图片描述
2.使用列表推导式
注意: 这里我将使用两层嵌套的列表推导
格式为:【 [expression for i in a ] for j in b 】expression包含 i,j的 表达式,类似于包含自变量为i,j的函数。

%%time 
res1 = pd.DataFrame([[(X[j,i]+1) for i in range(X.shape[1])] for j in range(X.shape[0])])
res1.head(3) 

在这里插入图片描述
不过令我奇怪的是这里所花的时间竟然比for循环还长

  1. 直接使用numpy矩阵
%%time 
res2 = pd.DataFrame(X + 1) 
res2.head(3) 

在这里插入图片描述

很显然,计算速度快了可不是一点点呀。毕竟numpy的及时C++写的,所以,以后用到数据计算的时候,尽量使用numpy矩阵计算,少使用for循环。

### 将Python中的列表转换为数值 在Python中,可以采用多种方式将字符串组成的列表转换为数值型数据。以下是几种常见的实现方法: #### 方法一:使用循环结构 通过遍历列表并逐一判断每个元素的内容来完成转换操作。 ```python num_list = ['13', '', '', '', '6', '0'] l = [] for i in num_list: if i == "": l.append(0) # 如果为空字符串,则将其替换为0 else: l.append(int(i)) # 否则将字符串转化为整数 ``` 这种方法简单易懂,适合初学者理解应用[^1]。 #### 方法二:利用列表推导式简化代码 相比传统循环写法更加简洁高效的同时保持良好的可读性执行效率。 ```python num_list = ['13', '', '', '', '6', '0'] new_list = [0 if i == "" else int(i) for i in num_list] ``` 此段代码实现了相同的功能却仅需一行即可达成目标[^1]。 #### 方法三:借助map函数配合lambda表达式处理复杂逻辑场景下的需求 当面对较为复杂的业务规则或者需要频繁调用特定算法时,map结合匿名函数能够有效减少重复劳动量提升开发速度. ```python num_list = ['13', '', '', '', '6', '0'] new_list = [0 if i == "" else i for i in num_list] num_list_new = list(map(lambda x: int(x), new_list)) ``` 上述例子展示了如何先清理原始数据再统一转型的过程. #### 方法四:引入NumPy库进行批量运算加速性能敏感场合的应用表现 对于大规模科学计算任务而言,Numpy提供了强大的向量化支持能力,使得我们可以轻松应对海量级的数据集而无需担心内存溢出等问题发生. ```python import numpy as np arr = np.array(['13', '', '', '', '6', '0']) numeric_arr = arr.astype(float) # 自动把空字符串解析成nan numeric_arr[np.isnan(numeric_arr)] = 0 # 把nan替换成零值 ``` 该方案特别适用于矩阵运算密集型程序设计当中[^1]. ### 总结 以上介绍了四种不同的技术手段帮助开发者解决实际工作中遇到的各种情况下的列表到数值之间的相互转化难题。每一种都有其独特的优势所在,在具体选型过程中应综合考虑项目背景以及个人偏好等因素做出最佳决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值