You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Datetime代码性能调优求助:将耗时从20-40秒降至2秒内

性能优化方案:替换循环为向量化时间运算

原代码性能瓶颈分析

原代码通过Python循环逐段更新TC列,每次循环都执行布尔索引和赋值操作,这类实现效率极低:

  • 每次df.loc[...]操作都会遍历整个DataFrame,时间复杂度为O(n);循环次数随时间跨度线性增长(例如1天就有240次循环),总复杂度达到O(n*k)(k为循环次数)。
  • Python循环本身的解释器开销远高于Pandas/NumPy的向量化C实现。

优化方案:向量化区间映射

利用Pandas的时间序列函数,直接计算每个时间戳对应的6分钟区间起始时间,完全避免循环:

import pandas as pd
from datetime import datetime, timedelta

# 保留原有的minDate和maxDate计算逻辑
minDate = df[time_variable].min().replace(hour=0)
maxDate = df[time_variable].max().replace(hour=23) + timedelta(hours=1)

print(datetime.now())
# 计算每个时间戳相对于minDate的时间差(分钟数)
delta_minutes = (df[time_variable] - minDate).dt.total_seconds() // 60

# 计算对应区间的起始时间:将分钟数向下取整到6的倍数,转换回时间格式
interval_starts = minDate + pd.to_timedelta((delta_minutes // 6) * 6, unit='m')

# 对齐原逻辑:仅替换(minDate, nextTime]区间内的时间,等于minDate的保留原值
df["TC"] = df[time_variable].where(df[time_variable] == minDate, interval_starts)
print(datetime.now())

更简洁的分组实现

也可以使用pd.Grouper按6分钟区间分组,直接映射区间起始时间:

print(datetime.now())
# 按6分钟间隔分组,起始点与原代码的minDate对齐
df["TC"] = df.groupby(
    pd.Grouper(key=time_variable, freq='6T', origin=minDate)
)[time_variable].transform(lambda x: x.name.floor('6T'))
print(datetime.now())

效果说明

向量化操作的时间复杂度为O(n),完全消除了循环开销,对于百万级数据量,耗时通常可控制在1秒以内,轻松满足你将耗时缩减至2秒以内的需求。

内容的提问来源于stack exchange,提问作者P Ved

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:39:25