ToList()所带来的性能影响

通过案例分析ToList()和Count()方法如何显著降低程序性能,并提供优化建议。

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

原文: ToList()所带来的性能影响

    前几天优化师弟写的代码,有一个地方给我留下很深刻的印象,就是我发现他总是将PLINQ的结果ToList<>(),然后再返回给主程序,对于这一点我十分不解,于是去问他是什么原因,得到的答案很幽默:因为习惯。
    有时候对于方法的不甚了解加上“习惯”,往往是程序性能和稳定性终结者,就拿这个Case来说吧,原始代码如下:
var query = from cr in LCRNormal.AsParallel() let listId = from crt in LCRNormal group crt by crt.KeyValue into m select m.Max(n => n.DBID) where listId.Contains(cr.DBID) && !cr.IsRegularRecord && cr.Status != 3 select new ComputingResultForTemp() { KeyValue = cr.KeyValue, DBID = cr.DBID, Status = cr.Status };

 

    经过以上PLINQ后,泛型列表中大概还剩下60万至100万条数据,然后我们这位师弟做了两个很“施瓦辛格”的动作:ToList<>()和Count(),测试程序运行在一台4*2G HZ,12GB内存的服务器上,竟然跑了2天多!我觉得正式这两个方法导致了程序性能的降低,为了  确定我的判断,我分别在以上代码、ToList<>()和Count()周围加上了StopWatch计时器,然后将结果以文本的形式输出:
    ● 100万数据PLINQ:
==========3/26/2011 01:34:31 PM ===========
**(GetDeletedRecords)Start PLINQ(LINQ FITTER)
==========3/26/2011 01:38:38 PM ===========
**(GetDeletedRecords)Finish PLINQ (LINQ FITTER)
   ●  80万数据ToList <>():
==========3/26/2011 03:22:10 PM ===========
**(GetDeletedRecords)Start Get List
●  80万数据Count():
==========3/28/2011 02:12:09 PM ===========
**(GetDeletedRecords)Start Get Count
==========3/28/2011 08:50:55 PM ===========
** (GetDeletedRecords)Finish Get Count
    日志格式是这样:任务开始时输出当前时间和“Start”,任务结束时输出“Finish”,当从日志中可以看出,PLINQ的效率还是很高的,只运行了几分钟;ToList<>()方法在运行了1天多后人为终止,所以只有Start没有Finish;Count()方法也运行了6小时多。
    所以最终优化方案很简单,去掉了ToList和Count,程序从几天的运行时间一下缩短到几个小时。

在编程中,`tolist()` 方法通常用于将特定数据结构(如数组、集合或其他序列)转换为 Python 列表(`list`)。该方法的使用可以简化对数据的操作和处理,尤其是在进行数据分析、机器学习或科学计算时。以下是一些常见的应用场景和实现方式: ### NumPy 数组中的 `tolist()` 在 NumPy 中,`ndarray` 对象提供了 `tolist()` 方法,用于将数组转换为嵌套的 Python 列表。这在需要与不支持 NumPy 类型的库交互时非常有用。 ```python import numpy as np arr = np.array([[1, 2], [3, 4]]) lst = arr.tolist() print(lst) # 输出: [[1, 2], [3, 4]] ``` ### Pandas 数据框中的 `tolist()` 在 Pandas 中,虽然 `DataFrame` 和 `Series` 没有直接的 `tolist()` 方法,但可以通过 `Series.tolist()` 将某一列或索引转换为列表。 ```python import pandas as pd df = pd.DataFrame({'A': [1, 2, 3]}) column_list = df['A'].tolist() print(column_list) # 输出: [1, 2, 3] ``` ### SciPy 稀疏矩阵中的 `tolist()` SciPy 的稀疏矩阵支持 `tolist()` 方法,用于将其转换为标准的 Python 列表形式,便于进一步处理。 ```python from scipy.sparse import csr_matrix sparse_matrix = csr_matrix([[0, 1], [2, 0]]) dense_list = sparse_matrix.tolist() print(dense_list) # 输出: [[0, 1], [2, 0]] ``` ### 自定义类中的 `tolist()` 如果正在开发自定义的数据结构,也可以实现 `tolist()` 方法以提供类似的功能。例如: ```python class MyDataStructure: def __init__(self, data): self.data = data def tolist(self): return list(self.data) custom_obj = MyDataStructure([10, 20, 30]) result = custom_obj.tolist() print(result) # 输出: [10, 20, 30] ``` ### 注意事项 - **性能考量**:对于大型数据集,`tolist()` 可能会带来性能开销,因为它需要复制数据并转换为新的格式。 - **内存占用**:由于 Python 列表比 NumPy 数组等结构更占内存,因此在处理大数据时需谨慎使用。 通过这些示例,可以看出 `tolist()` 在多种数据处理场景中都具有实用价值,尤其适用于需要将数据从特定格式转换为通用 Python 列表的情况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值