如何让我的Python代码运行得更快

2024-03-09

我正在研究循环多个 netcdf 文件(大~28G)的代码。 netcdf 文件在整个域中具有多个 4D 变量 [时间、东西、南北、高度]。目标是循环这些文件并循环域中所有这些变量的每个位置,并将某些变量存储到一个大数组中。当文件丢失或不完整时,我用 99.99 填充值。现在,我只是通过循环 2 个每日 netcdf 文件进行测试,但由于某种原因,它需要很长时间(约 14 小时)。我不确定是否有办法优化这段代码。我认为 python 不应该花这么长时间来完成这项任务,但也许这是 python 或我的代码的问题。下面是我的代码,希望它是可读的,并且非常感谢任何有关如何使其更快的建议:

#Domain to loop over
k_space = np.arange(0,37)
j_space = np.arange(80,170)
i_space = np.arange(200,307)

predictors_wrf=[]
names_wrf=[]

counter = 0
cdate = start_date
while cdate <= end_date:
    if cdate.month not in month_keep:
        cdate+=inc
        continue
    yy = cdate.strftime('%Y')        
    mm = cdate.strftime('%m')
    dd = cdate.strftime('%d')
    filename = wrf_path+'\wrfoutRED_d01_'+yy+'-'+mm+'-'+dd+'_'+hour_str+'_00_00'
    for i in i_space:
        for j in j_space:
            for k in k_space:
                    if os.path.isfile(filename):
                        f = nc.Dataset(filename,'r')
                        times = f.variables['Times'][1:]
                        num_lines = times.shape[0]
                        if num_lines == 144:
                            u = f.variables['U'][1:,k,j,i]
                            v = f.variables['V'][1:,k,j,i]
                            wspd = np.sqrt(u**2.+v**2.)
                            w = f.variables['W'][1:,k,j,i]
                            p = f.variables['P'][1:,k,j,i]
                            t = f.variables['T'][1:,k,j,i]
                        if num_lines < 144:
                            print "partial files for WRF: "+ filename
                            u = np.ones((144,))*99.99
                            v = np.ones((144,))*99.99
                            wspd = np.ones((144,))*99.99
                            w = np.ones((144,))*99.99
                            p = np.ones((144,))*99.99
                            t = np.ones((144,))*99.99
                    else:
                        u = np.ones((144,))*99.99
                        v = np.ones((144,))*99.99
                        wspd = np.ones((144,))*99.99
                        w = np.ones((144,))*99.99
                        p = np.ones((144,))*99.99
                        t = np.ones((144,))*99.99
                        counter=counter+1
                    predictors_wrf.append(u)
                    predictors_wrf.append(v)
                    predictors_wrf.append(wspd)
                    predictors_wrf.append(w)
                    predictors_wrf.append(p)
                    predictors_wrf.append(t)
                    u_names = 'u_'+str(k)+'_'+str(j)+'_'+str(i)
                    v_names = 'v_'+str(k)+'_'+str(j)+'_'+str(i)
                    wspd_names = 'wspd_'+str(k)+'_'+str(j)+'_'+str(i)
                    w_names = 'w_'+str(k)+'_'+str(j)+'_'+str(i)
                    p_names = 'p_'+str(k)+'_'+str(j)+'_'+str(i)
                    t_names = 't_'+str(k)+'_'+str(j)+'_'+str(i)
                    names_wrf.append(u_names)
                    names_wrf.append(v_names)
                    names_wrf.append(wspd_names)
                    names_wrf.append(w_names)
                    names_wrf.append(p_names)
                    names_wrf.append(t_names)
    cdate+=inc

这是收紧你的第一关。forloops。由于每个文件仅使用一次文件形状,因此您可以将处理移到循环之外,这应该减少中断处理中的数据加载量。我还是不明白什么counter and inc这样做,因为它们似乎没有在循环中更新。您肯定想研究重复的字符串连接性能,或者附加到的性能如何predictors_wrf and names_wrf看起来是起点

k_space = np.arange(0,37)
j_space = np.arange(80,170)
i_space = np.arange(200,307)

predictors_wrf=[]
names_wrf=[]

counter = 0
cdate = start_date
while cdate <= end_date:
    if cdate.month not in month_keep:
        cdate+=inc
        continue
    yy = cdate.strftime('%Y')        
    mm = cdate.strftime('%m')
    dd = cdate.strftime('%d')
    filename = wrf_path+'\wrfoutRED_d01_'+yy+'-'+mm+'-'+dd+'_'+hour_str+'_00_00'
    file_exists = os.path.isfile(filename)
    if file_exists:
        f = nc.Dataset(filename,'r')
        times = f.variables['Times'][1:]
        num_lines = times.shape[0]
    for i in i_space:
        for j in j_space:
            for k in k_space:
                    if file_exists:    
                        if num_lines == 144:
                            u = f.variables['U'][1:,k,j,i]
                            v = f.variables['V'][1:,k,j,i]
                            wspd = np.sqrt(u**2.+v**2.)
                            w = f.variables['W'][1:,k,j,i]
                            p = f.variables['P'][1:,k,j,i]
                            t = f.variables['T'][1:,k,j,i]
                        if num_lines < 144:
                            print "partial files for WRF: "+ filename
                            u = np.ones((144,))*99.99
                            v = np.ones((144,))*99.99
                            wspd = np.ones((144,))*99.99
                            w = np.ones((144,))*99.99
                            p = np.ones((144,))*99.99
                            t = np.ones((144,))*99.99
                    else:
                        u = np.ones((144,))*99.99
                        v = np.ones((144,))*99.99
                        wspd = np.ones((144,))*99.99
                        w = np.ones((144,))*99.99
                        p = np.ones((144,))*99.99
                        t = np.ones((144,))*99.99
                        counter=counter+1
                    predictors_wrf.append(u)
                    predictors_wrf.append(v)
                    predictors_wrf.append(wspd)
                    predictors_wrf.append(w)
                    predictors_wrf.append(p)
                    predictors_wrf.append(t)
                    u_names = 'u_'+str(k)+'_'+str(j)+'_'+str(i)
                    v_names = 'v_'+str(k)+'_'+str(j)+'_'+str(i)
                    wspd_names = 'wspd_'+str(k)+'_'+str(j)+'_'+str(i)
                    w_names = 'w_'+str(k)+'_'+str(j)+'_'+str(i)
                    p_names = 'p_'+str(k)+'_'+str(j)+'_'+str(i)
                    t_names = 't_'+str(k)+'_'+str(j)+'_'+str(i)
                    names_wrf.append(u_names)
                    names_wrf.append(v_names)
                    names_wrf.append(wspd_names)
                    names_wrf.append(w_names)
                    names_wrf.append(p_names)
                    names_wrf.append(t_names)
    cdate+=inc
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让我的Python代码运行得更快 的相关文章

  • Python - 比较同一字典中的值

    我有一本字典 d Trump MAGA FollowTheMoney Clinton dems Clinton Stein FollowTheMoney Atlanta 我想删除字符串列表中的重复字符串 该字符串是键的值 对于这个例子 期望
  • 如何在 Matplotlib 饼图周围绘制箭头以将每个标签指向圆圈中各自的部分?

    我一直在用 Matplotlib 绘制一些图表 我有一个饼图 想要在图表周围绘制箭头 使每个标签都指向图表 我有一个例子 这是我当前的代码 import matplotlib pyplot as plt plt rcParams font
  • 如何在 __init__ 中使用await设置类属性

    我如何定义一个类await在构造函数或类体中 例如我想要的 import asyncio some code class Foo object async def init self settings self settings setti
  • 多输出堆叠回归器

    一次性问题 我正在尝试构建一个多输入堆叠回归器 添加到 sklearn 0 22 据我了解 我必须结合StackingRegressor and MultiOutputRegressor 经过多次尝试 这似乎是正确的顺序 import nu
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • Django Rest Framework 是否有第三方应用程序来自动生成 swagger.yaml 文件?

    我有大量的 API 端点编写在django rest framework并且不断增加和更新 如何创建和维护最新的 API 文档 我当前的版本是 Create swagger yaml文件并以某种方式在每次端点更改时自动生成 然后使用此文件作
  • 如何从Python中的函数返回多个值? [复制]

    这个问题在这里已经有答案了 如何从Python中的函数返回多个变量 您可以用逗号分隔要返回的值 def get name you code return first name last name 逗号表示它是一个元组 因此您可以用括号将值括
  • 使用主题交换运行多个 Celery 任务

    我正在用 Celery 替换一些自制代码 但很难复制当前的行为 我期望的行为如下 创建新用户时 应向tasks与交换user created路由键 该消息应该触发两个 Celery 任务 即send user activate email
  • python multiprocessing 设置生成进程等待

    是否可以生成一些进程并将生成进程设置为等待生成的进程完成 下面是我用过的一个例子 import multiprocessing import time import sys def daemon p multiprocessing curr
  • Python 3d 绘图设置固定色阶

    我正在尝试绘制两个 3d 数组 第一个数组的 z 值在范围内 0 15 0 15 第二个来自 0 001 0 001 当我绘图时 色标自动遵循数据范围 如何设置自定义比例 我不想看到 0 001 的浅色 而应该看到 0 15 的浅色 如何修
  • MongoEngine 查询具有以列表中指定的前缀开头的属性的对象的列表

    我需要在 Mongo 数据库中查询具有以列表中任何前缀开头的特定属性的元素 现在我有一段这样的代码 query mymodel terms term in query terms 并且这会匹配在列表 term 上有一个项目的对象 该列表中的
  • 打印数字时添加千位分隔符[重复]

    这个问题在这里已经有答案了 我真的不知道这个问题的 名称 所以它可能是一个不正确的标题 但问题很简单 如果我有一个数字 例如 number 23543 second 68471243 我想要它使print 像这样 23 54368 471
  • 嵌套作用域和 Lambda

    def funct x 4 action lambda n x n return action x funct print x 2 prints 16 我不太明白为什么2会自动分配给n n是返回的匿名函数的参数funct 完全等价的定义fu
  • Django 视图中的“请求”是什么

    在 Django 第一个应用程序的 Django 教程中 我们有 from django http import HttpResponse def index request return HttpResponse Hello world
  • Django REST Framework - CurrentUserDefault 使用

    我正在尝试使用CurrentUserDefault一个序列化器的类 user serializers HiddenField default serializers CurrentUserDefault 文档说 为了使用它 请求 必须作为
  • Python GTK+ 画布

    我目前正在通过 PyGobject 学习 GTK 需要画布之类的东西 我已经搜索了文档 发现两个小部件似乎可以完成这项工作 GtkDrawingArea 和 GtkLayout 我需要一些基本函数 如 fillrect 或 drawline
  • SignalR 似乎正在减慢我的 MVC/Azure 应用程序的启动速度

    我有一个 MVC 应用程序在 Windows Azure 上的 WebRole 上的 NET 4 5 下运行 使用 SignalR 1 0 alpha2 并使用 ServiceBus 底板 在我的 App Start 文件夹中 我有 Reg
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • 在virtualenv中下载sqlite3

    我正在尝试使用命令创建应用程序python3 manage py startapp webapp但我收到一条错误消息 django core exceptions ImproperlyConfigured 加载时出错 pysqlite2 或
  • 如何将Python3设置为Mac上的默认Python版本?

    有没有办法将 Python 3 8 3 设置为 macOS Catalina 版本 10 15 2 上的默认 Python 版本 我已经完成的步骤 看看它安装在哪里 ls l usr local bin python 我得到的输出是这样的

随机推荐

  • 语法错误:无法分配给运算符

    def RandomString length distribution string for t in distribution t 1 length t 1 string return shuffle string 这会返回标题中描述的
  • Bash 错误:需要整数表达式

    在下面的部分中 您将看到我尝试在 UNIX 计算机上运行的 shell 脚本以及脚本 当我运行这个程序时 它给出了预期的输出 但它也给出了记录中显示的错误 可能是什么问题以及如何解决它 首先 脚本 usr bin bash while re
  • 如何在IE中使用border-radius.htc制作圆角

    如何在IE中使用border radius htc制作圆角 我在用边界半径 htc http www htmlremix com css curved corner border radius cross browser修复 IE 中的边框
  • JavaScript 中的 Google Analytics API

    我正在使用 Google Analytics Javascript 库让用户查看他们所在的特定页面的地理地图 然而 每次他们尝试这样做时 您都必须经过身份验证过程才能将我的数据显示在我的页面上 我怎样才能找到替代方案 我只想通过页面上的可视
  • 如何强制keras使用tensorflow GPU后端

    我知道这是最受欢迎的问题之一 但到目前为止 没有一个解决方案对我有用 我正在运行一个用以下语言编写的遗留代码tensorflow v1 13 1 and keras v2 2 4 我无法修改代码来运行最新的张量流版本 由于 keras 现已
  • 如何编译 Programmer Dvorak?

    我正在尝试编译开源项目程序员德沃夏克 http www kaufmann no roland dvorak 问题是它有点旧 并且不能使用当前版本的构建工具进行构建 您可以在我的网站上查看完整的源代码以及我在线所做的修改项目的 Google
  • sqlite alter table 在单个语句中添加多个列

    是否可以在 sqlite 的单个语句中更改表添加多个列 以下内容将不起作用 alter table test add column mycolumn1 text add column mycolumn2 text 不 您必须一次添加一个 请
  • 使用 MS SQL Server 读取包含多个 JSON 对象的文件

    我需要帮助在 MSSQL 中读取 JSON 文件 我有一个像这样的 json 格式 id oid 5c6ceb395916c77f71d9f531 uuid 8337df01 7d98 4cdd b5eb 7fafa88d3740 firs
  • CoreAnimation、AVFoundation 和视频导出功能

    我正在寻找将图片序列导出为 QuickTime 视频的正确方法 我知道 AV Foundation 能够合并或重新组合视频 还能够添加音轨来构建单个视频资产 现在 我的目标有点不同 我想从头开始创建一个视频 我有一组 UIImage 我需要
  • capistrano 部署时使用了错误版本的 Ruby

    在我使用 capistrano 部署到新服务器后 我看到 共享 捆绑 红宝石 1 9 1 gems 我什至没有在服务器上安装 ruby 1 9 1 如果我跑 ruby v它返回 1 9 3 但在所有的 capisrtano 操作中我一直看到
  • Spring、NotReadablePropertyException 和 Glassfish 版本

    我正在开发一个使用 Spring MVC 的 Web 应用程序 它在 Glassfish 3 0 1 上运行良好 但当迁移到 Glassfish 3 1 时 它开始表现得很奇怪 有些页面仅部分显示 或根本不显示任何内容 并且在日志中 有很多
  • 使用正则表达式和 bash 重命名文件[重复]

    这个问题在这里已经有答案了 可能的重复 在unix中一次重命名多个文件 https stackoverflow com questions 1086502 rename multiple files at once in unix 我想使用
  • 应用程序身份验证和应用程序用户的预期用例是什么?

    我试图了解应用程序身份验证和应用程序用户的预期用例是什么 我基本上正在考虑构建一个应用程序 该应用程序将使用 Box 来存储订阅我们服务的用户的数据 我们的服务将允许每个用户访问和查看他们的数据 如果我的帐户基本上拥有所有订阅用户的数据 我
  • 我们可以使用 Bunit 在 Blazor WebAssembly 中进行单元测试控制器吗

    我们可以使用 Bunit x 单元对 Blazor WebAssembly 中的控制器 端点进行单元测试吗 https bunit dev https bunit dev 像这样https learn microsoft com en us
  • 使用Boost.Asio获取“整个数据包”

    我有一个 TCP 客户端连接到我的服务器 它正在发送原始数据包 如何使用 Boost Asio 每次都能获取 整个 数据包 当然是异步的 假设这些数据包可以是任意大小 最多可达我的内存的完整大小 基本上 我想避免创建静态大小的缓冲区 通常
  • 何时使用 TestFixtureSetUp 属性而不是默认构造函数?

    NUnit 文档没有告诉我何时使用带有 a 的方法TestFixtureSetup以及何时在构造函数中进行设置 public class MyTest private MyClass myClass public MyTest myClas
  • webpack-dev-server 编译但不刷新我的网络浏览器

    我正在尝试使用 webpack dev server 热加载 我的 jsx 组件 这是我正在使用的命令 bin webpack dev server host 0 0 0 0 当我保存 jsx 代码时 它会有趣地进行编译 但不会通知我的开发
  • 实体类的 GetHashCode() 的正确实现是什么?

    下面是一个实体基类的重写 Object Equals 的示例实现 应用程序中的所有其他实体都派生自该实体基类 所有实体类都有 Id 属性 它是一个可为 null 的 int 它是实体类对应的任何表的主键 public override bo
  • 如何在控制器中使用辅助函数?

    我在 app helper 文件中编写了一些函数 现在我需要在我的控制器中调用该函数 我如何在 CAKEPHP 中做到这一点 你不能 如果您的函数非常通用 可以在视图之外使用 请在中创建它们bootstrap php或在中创建自定义库 类l
  • 如何让我的Python代码运行得更快

    我正在研究循环多个 netcdf 文件 大 28G 的代码 netcdf 文件在整个域中具有多个 4D 变量 时间 东西 南北 高度 目标是循环这些文件并循环域中所有这些变量的每个位置 并将某些变量存储到一个大数组中 当文件丢失或不完整时