如何在windows使用valgrind_如何在windows下使用f2py

2023-11-07

什么是f2py

f2py是一个将fortran或者c程序转化成python可以调用的库的工具,它几乎和numpy同时出现,使用也相对比较方便,因此一直在numpy包中。在早期,f2py起到的作用类似于numba。你可以将程序的主要逻辑交给python处理,把计算交给fortran,这样兼顾了开发效率和运行效率。并且f2py也可以反向使用,即在fortran中调用python,但是这多少给人有脱裤子放屁的感觉。

现在人们很少用它的原因一方面是numpy已经提供了效率极高的库函数,几乎没有什么需要自己重新写。另外利用numba对循环进行加速的效率也几乎和二进制一致,而实现又非常简单,只需加一个装饰器 @jit。尽管numba并不支持python所有的特性,但是我们完全可以把python当做不需要声明变量类型的fortran使用,这样一些功能基本上已经得到numba的支持,因此f2py的使用场合越来越少。

可是在实践当中,如果手动将一些反复调用的计算过程用fortran重写,在效率上还是可以得到显著提升的。这里面主要原因在于两点:(一)fortran程序是要明确接口数据类型的,节省大量开销;julia语言就借鉴了这一点,如果要获得更好的性能,应明确接口数据类型。(二)numba也未必总是可以优化到原生代码的水平。

在linux下安装和使用f2py相对比较简单,但是在windows下即使安装了anaconda还是要做一些后期处理,因此略显麻烦。这篇文章就是简单总结一下最近实践的结果,首先说明如何在windows下安装f2py,然后简单说明说明如何使用f2py,最后给出一些运算效率的评价。

如何安装和配置

首先需要做的预备工作是安装anaconda,其自带f2py。然后需要一个额外的步骤是安装mingw和libpython。打开powershell,输入以下命令,将会安装mingw和libpython。其中mingw自带gfortran编译器。

conda install mingw, libpython

安装完成后还需要将mingw中可执行文件的路径加入到windows系统的path当中。通常mingw会安装在anaconda目录下,打开后进入“bin”目录,将路径复制加入path。加入路径的方式通常为,右键我的电脑,选择“属性”,在“高级属性”中找到“环境变量”的选项,在环境变量中找到“path”变量,在path变量的末尾添加当前路径,记得用分号和其它路径隔开。

然后在powershell中输入f2py.exe,看系统是否可以找到这个命令。

以上的过程在win7或者win10下是一致的,后期编译就用gfortran。如果你安装了intel-fortran或者其它fortran编译器,需要在编译的时候指定他们的名字。

如何使用f2py

使用f2py你需要对fortran有一定的了解。f2py已经停止开发很多年,它只支持fortran90的很少一部分特性,因此对于编译器的要求并不高。目前mingw的64位版本自带的fortran编译器只到4.7,但是绝大部分常用语法都已经实现,完全支持fortran95的标准,并且支持openmp3.5。更新的编译器无非是支持fortran语言的新标准,并不影响使用。

由于fortran是一门在上古时期的已经存在的语言,并且为了兼容、效率等原因,有许多自己的特点,而实际上只是为了和python一起使用,其实并不需要掌握太多细节。这里仅仅举一个例子说明f2py的用法,至于如何学习一个精简版的fortran,在其它地方说明。

例如现在要计算两个实数的加法,安照fortran的做法要首先写一个子过程(subroutine)如下。

subroutine myadd(a,b,c)
implicit none
real*8::a,b
real*8,intent(out)::c
c=a+b
end subroutine

将其放入文件例如名字为“test.f90”中。在fortran中是支持函数的,但是f2py主要是对fortran中的子过程进行处理,使之能够被python所用。紧接着需要用f2py生成一个python可以导入的库文件,输入下面的命令:

f2py.exe -c test.f90 -m test

这里的"-c"和所有的编译器一样,后面跟源文件,"-m"指定产生库的文件名称,这样在你的文件夹下就会产生一个"test.XXX.pyd"的文件。这里的"XXX"是f2py给你添加的一串字符主要是python的版本号和系统信息,例如我的是"test.cp37-win_amd64.pyd",这个名字不需要修改。

紧接着如果要在python中使用该子程序,需要将该库导入如下:

from numpy import *
from test import myadd
c=myadd(1,2)
print(c)

就可以得到下面的结果:

可以看到实际使用过程中,myadd更像一个函数而不是子过程,至于为什么是这样,需要对f2py进一步的了解。

性能评价

我用自己的计算项目进行了简单测试,性能的提升主要是来自于一些不必要的开销。像numba实际上是需要一个预编译阶段,会占用一点时间,其次python语言本身的一些开销,例如类型的判断等。因此在计算强度不大时,fortran还是凸显出自己的实力,但是一旦计算量比较大,这些额外的开销就微不足道了。利用fortran的提升优势就不太明显了。我自身的例子是一个复杂度和矩阵乘法一样的程序。当矩阵尺度为1000时,大约有14%的提升,但是达到2000时,有7%的提升。

总结

经过简单的测试和分析,基本上可以肯定的是,如果你对fortran还比较熟悉,利用f2py加速是一个相当不错的选择,它能结合python输入输出的便利和fortran的高效。如果不会fortran的话,还是让这个语言慢慢消失吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在windows使用valgrind_如何在windows下使用f2py 的相关文章

  • chmod函数

    int chmod const char pathname mode t mode 作用 修改文件的权限 参数 mode 需要修改的权限值 宏或者八进制数 返回值 成功 0 失败 1 include
  • 线性表顺序存储及相关操作(创建,插入,删除,遍历)

    线性表类型的定义 线性表是由同类数据元素构成的有序序列的线性结构 表中元素个数 n gt 0 称为线性表的长度 n 0时称为空表 在复杂线性表中 一个数据元素可以由若干个数据项 item 组成 这种情况下 常把数据元素称为记录 record
  • Linux 入门笔记(根据传智韩顺平整理的(一))

    开发步骤 1 Vi Hello java 2 输入i进入插入模式 3 输入esc 进入命令模式 4 输入 冒号 wq保存退出 q 退出不保存 5 编译Hello java gt javac Hello java 6 运行 java Hell
  • C++如何显示一个函数被调用的次数

    问题1 如何显示一个函数被调用的次数 使用static关键字 汉诺塔问题局部 void move char src char dest static int n 1 n具有全局寿命 但是局部可见 cout lt
  • 什么是漏洞扫描?

    首先什么是漏洞 国内外各种规范和标准中关于漏洞 也称脆弱性 英文对应Vulnerability 的定义很多 摘录如下 互联网工程任务组RFC4949 1 系统设计 部署 运营和管理中 可被利用于违反系统安全策略的缺陷或弱点 中国国家标准 信
  • 分布式与高并发(一)了解多线程的意义和使用

    了解多线程的意义和使用 什么是线程 并发与高并发 客户端向Tomcat发送请求 在Tomcat中存在多个个并发数 这个并发数由什么决定的 并发 单位时间内能够同时处理的请求数 默认情况下Tomcat可以支持的最大请求数是150 也就是同时支
  • 资深测试老鸟整理,性能测试-常见调优详细,卷起来...

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • python报错“No module named xarray”

    在python运行 import xarray as xr 报错 No module named xarray 在命令提示符中显示已安装 一 检查 1 确认 Python 解释器路径 运行以下代码 查看正在使用的 Python 解释器路径
  • python:playwright结合pytest执行用例

    playwright结合Pytest为您的 Web 应用程序编写端到端的测试 安装pytest插件 C Users lifeng01 gt pip install pytest playwright Collecting pytest pl
  • Linux下CMake编译链接线程库以及线程绑定

    CMake编译链接线程库 1 设置链接选项 使用 CMake 编译程序时 需要设置链接选项来链接 pthread 库 在 CMakeLists txt 文件中添加链接选项 即在add executable 下面添加以下代码将 pthread
  • Tomcat性能优化(二)

    六 NIO连接器前端整体框图 1 图解tomcat总体流程 源码详细分析解读见视频 连接器在Tomcat中是一个重要的组件 叫做Tomcat前端 这个前端框架不是通常我们讲的Web前端 那是structs javascript jsp这些内
  • A记录,子域名,CNAME,MX,TXT,SRV

    http zhanghucheng cn post 8 A记录 A Address 记录是用来指定主机名 或域名 对应的IP地址记录 用户可以将该域名下的网站服务器指向到自己的web server上 同时也可以设置您域名的子域名 通俗来说A
  • Git:Unable to negotiate with错误

    今天更新了一下Git版本 发现推送代码的时候提示 Unable to negotiate with xx xx xx xx port 29418 no matching host key type found Their offer ssh
  • JS 如何将数组对象中多个特定值取出形成新数组

    有如下数据 list mainId 581 errMsg null sort null status null nowFarmId null nowPigstyId null insideEarCode MT5687G pigEntityC
  • Linux操作系统原理与应用实验 实验三 实验四 问题总结

    本文是在进行Linux实验三和实验四所遇到的问题或学到的小知识进行总结 以调通程序为内容导向 问题的解决方法或许不难 也都能搜到 但是如果笔者自己总结下来能够节省很多人去搜索解决方法的繁琐步骤 节省大家的时间 实验三 文件操作算法 新版本带
  • gdb调试动态链接库

    转自 http www cnblogs com ybgame archive 2012 03 23 2414078 html 在 Linux 可以用 gdb 来调试应用程序 当然前提是用 gcc 编译程序时要加上 g 参数 我这篇文章里将讨
  • ML学习笔记(二)----交叉验证、偏差和方差分析

    什么是交叉验证 交叉验证是一种模型验证技术 可用于评估统计分析 模型 结果在其它独立数据集上的泛化能力 它主要用于预测 我们可以用它来评估预测模型在实践中的准确度 交叉验证的目标是定义一个数据集 以便于在训练阶段 例如 验证数据集 中测试模
  • JAVA中类的加载过程

    摘自 http soft chinabyte com database 312 12643812 shtml http www cnblogs com yshb archive 2012 11 05 2756194 html 类的生命周期
  • 0.96寸oled显示坏苹果(badapple)

    前言 俗话说 有屏幕的地方就会有badapple 下面带来使用0 96寸OLED屏幕显示badapple的教程 1 获取视频 首先从网上下载badapple的视频 下载地址 badapple 2 抓取视频图片 使用OLED播放视频的思想就是

随机推荐

  • 微信小程序开发课程学习总结(关于电影的内容)

    微信小程序开发课程学习总结 关于电影的内容 最终效果 课程学习网址 让我们开始第一步 一堆页面简介 app js 文件 app json文件 app wxss文件 好了正式开始第一个页面 新闻详情页面 电影模块 关于Template 模板
  • Asp.net可输入下拉框服务器控件 C#版

    备注 改自Ryan Liu dpliu cbdsystem com cn vb net using System using System Collections using System ComponentModel using Syst
  • 错误码:events.js:183 throw er; // Unhandled ‘error‘ event—解决方案

    显示内容 events js 291 throw er Unhandled error event Error listen EADDRINUSE address already in use 80 at Server setupListe
  • watch监听(普通和深度监听)

    普通 data user 定义要监听的对象 watch 普通监听值有变化就打印 newVal oldVal新旧值参数 user newVal oldVal console log user this user 深度监听 监听对象里面的数组或
  • 架构师日记-深入理解软件设计模式

    作者 京东零售 刘慧卿 一 设计模式与编程语言 1 1 什么是设计模式 设计模式 Design pattern 由软件开发人员在软件开发中面临常见问题的解决方案 是经过长时间的试验积累总结出来的 它使设计更加灵活和优雅 复用性更好 从实用的
  • vue2里设置input光标位置

    人狠话不多 直接上业务需求 垃圾需求 凑合看 我的业务是在企微应用里 图片识别 然后点客户姓名 手机号 输入框 识别的结果可以点击回填到输入框内 这里思考回填的情况 1 可能是 直接输入 然后点下面识别的字回填 输入框是空的 直接点一个字拼
  • 【小甲鱼C语言】课后笔记第一章第一节——打印(printf)

    目录 1 打印 就是 输出 的意思 2 使用 GCC 编译程序 gcc 源代码 o 可执行文件 3 printf 是格式化输出函数 a 函数概要 b 函数原型 c 参数分析 d 返回值 e 演示 4 转义字符 5 反斜杠的奥义 6 课后习题
  • Qt自定义标题栏-移动窗口

    前情提要 众所周知 一个最简单的窗口也是有标题栏的 Windows默认提供的标题栏上有 图标 窗口标题 Min Max Close按钮 但是 这未免太过局限 高自由度的自定义是极客 Geek 精神不可或缺的一部分 如果你想在标题栏上增加 减
  • spring.jpa.hibernate.ddl-auto的配置

    spring jpa hibernate ddl auto 可以显式设置 spring jpa hibernate ddl auto 标准的Hibernate属性值有 none validate update create create d
  • mysql之 mysql 5.6不停机双主一从搭建(活跃双主一从基于日志点复制)

    环境说明 版本 version 5 6 25 log 主1库ip 10 219 24 25主2库ip 10 219 24 22从1库ip 10 219 24 26os 版本 centos 6 7已安装热备软件 xtrabackup 防火墙已
  • A template class for binding C++ to Lua

    A template class for binding C to Lua 标签 classc bindingconstructorluafunction 2006 09 09 15 50 1397人阅读 评论 0 收藏 举报 目录 htt
  • OpenMMLab-AI实战营第二期-人体关键点检测与MMPose

    人体关键点检测与MMPose 课程链接 https www bilibili com video BV1kk4y1L7Xb 这个课程的大致内容是介绍如何从给定的二维影像中恢复出人体的姿态 2D或者3D 大纲如下所示 基本上可以认为流程是 先
  • hadoop的DFSOutputStream

    当我们用命令 hadoop fs copyFromLocal localfile hdfs 将本地文件复制到HDFS时 其背后的复制过程是怎样的 本地文件通过什么方式传输到datanode上的呢 这里面很显然的是 1 文件在多个电脑之间进行
  • 基于clickhouse做用户画像,标签圈选

    clickhouse在做用户画像标签时 怎么去做圈选 表结构应该是怎么样的 我们应该怎么去处理 能够使其高性能的圈选 尽可能缩小其占用的存储空间 这个问题 我通过代码给大家做下的演示 先在hive中对数据预处理 最初表结构 create t
  • python/pta 7-42 纵横

    7 42 纵横 莫大侠练成纵横剑法 走上了杀怪路 每次仅出一招 这次 他遇到了一个正方形区域 由n n个格子构成 每个格子 行号 列号都从1开始编号 中有若干个怪 莫大侠施展幻影步 抢占了一个格子 使出绝招 横扫四方 就把他上 下 左 右四
  • 眼底图像血管增强与分割--(4)基于自适应对比度增强算法实现

    在 http blog csdn net piaoxuezhong article details 78385517 中介绍的自适应对比度增强算法 其基本原理是将图像分为低频背景和高频细节两部分 算法选择高频部分进行增益放大 这样就增强了细
  • 修复“net::err_cert_authority_invalid”错误

    1 背景 在请求接口时接口报错net err cert authority invalid 当您的浏览器无法验证您网站的SSL证书的有效性时 就会出现此问题 如果您尚未设置证书或为您的网站使用HTTP 不推荐 则不应遇到此错误 2 解决办法
  • 利用Python子进程关闭Excel自动化过程出现的弹窗

    利用Python进行Excel自动化操作的过程中 尤其是涉及VBA时 可能遇到消息框 弹窗 MsgBox 此时需要人为响应 否则代码卡死直至超时 1 2 根本的解决方法是VBA代码中不要出现类似弹窗 但有时我们无权修改被操作的Excel文件
  • python多线程编程: 使用互斥锁同步线程

    由于每个线程互相独立 相互之间没有任何关系 你干你的 我干我的 互相不干扰 如果要几个线程同时干一件事怎么办 由于互相不走动 如果一个线程已经做过了 另一个线程再去做 不就重复了吗 很容易乱套 现在假设这样一个例子 有一个全局的计数num
  • 如何在windows使用valgrind_如何在windows下使用f2py

    什么是f2py f2py是一个将fortran或者c程序转化成python可以调用的库的工具 它几乎和numpy同时出现 使用也相对比较方便 因此一直在numpy包中 在早期 f2py起到的作用类似于numba 你可以将程序的主要逻辑交给p