计算化学公社

 找回密码 Forget password
 注册 Register
Views: 4853|回复 Reply: 6
打印 Print 上一主题 Last thread 下一主题 Next thread

[Multiwfn资源与经验] 请管理员删除

[复制链接 Copy URL]

2479

帖子

11

威望

6864

eV
积分
9563

Level 6 (一方通行)

跳转到指定楼层 Go to specific reply
楼主
本帖最后由 我本是个娃娃 于 2022-10-15 18:15 编辑

请管理员删除


评分 Rate

参与人数
Participants 1
eV +5 收起 理由
Reason
sobereva + 5

查看全部评分 View all ratings

509

帖子

1

威望

4249

eV
积分
4778

Level 6 (一方通行)

2#
发表于 Post on 2022-9-10 21:34:44 | 只看该作者 Only view this author
请问python 脚本的并行化楼主可有门道了?最近想学习把脚本并行从而处理md轨迹时更快,希望找点学习资料

1063

帖子

0

威望

3277

eV
积分
4340

Level 6 (一方通行)

3#
发表于 Post on 2022-9-11 11:51:13 | 只看该作者 Only view this author
tjuptz 发表于 2022-9-10 21:34
请问python 脚本的并行化楼主可有门道了?最近想学习把脚本并行从而处理md轨迹时更快,希望找点学习资料

其实并不需要并行。
很多用到 Numpy 的脚本其实并没有将 Numpy 的优势发挥出来,而是用大量的 for 循环徒增了时间。

应用 Numpy 要尽可能抛弃使用 for 循环的思想,用 Numpy 自身的高级切片功能,axis= 选项,以及 Numpy 的函数来处理数据。

1063

帖子

0

威望

3277

eV
积分
4340

Level 6 (一方通行)

4#
发表于 Post on 2022-9-11 12:08:59 | 只看该作者 Only view this author
本帖最后由 乐平 于 2022-9-11 18:31 编辑

看了你的脚本,速度慢大概率是因为你用了 for 循环来筛选数据,然后将数据一个一个 append 到新的列表里。这样效率当然会下降。

Numpy 数组(不是 python 的 list)不需要用 for 循环筛选数据。Numpy 有高效地筛选数据的切片方法。


  1. data = data[(data[:,3]>-0.05) & (data[:,3] < 0.05)]
  2. X = data[:,3]
  3. Y = data[:,4]
复制代码

看了 Sob 老师的视频 用Multiwfn+Origin绘制RDG(NCI)方法的散点图_哔哩哔哩_bilibili ,发现应该是用最后两列的数据作图。你的代码里应该是写错了,我说怎么运行之后打印了一堆数据……      
    Line #1774986 (got 6 columns instead of 4)
    Line #1774987 (got 6 columns instead of 4)
    Line #1774988 (got 6 columns instead of 4)
    Line #1774989 (got 6 columns instead of 4)
    Line #1774990 (got 6 columns instead of 4)
    Line #1774991 (got 6 columns instead of 4)
    Line #1774992 (got 6 columns instead of 4)
    Line #1774993 (got 6 columns instead of 4)
    Line #1774994 (got 6 columns instead of 4)
    Line #1774995 (got 6 columns instead of 4)
    Line #1774996 (got 6 columns instead of 4)
    Line #1774997 (got 6 columns instead of 4)
    Line #1774998 (got 6 columns instead of 4)
    Line #1774999 (got 6 columns instead of 4)
    Line #1775000 (got 6 columns instead of 4)



我优化了脚本,目前处理数据的速度提升了。对于 Multiwfn/examples/2-pyridoxine_2-aminopyridine.wfn 文件,使用 Multiwfn 20 --> 1 --> 3 (High quality grid,   covering whole system, about 1728000 points in total)得到数据,总共 1775000 行 5 列数据118 MB。用 Numpy 切片方法处理数据在我四年前买的笔记本上(第八代 Intel CPU)只需要 8.5 秒左右。

加上了彩色,绘图结果如下:



Python 代码如下:
plot_RDG.py (1.5 KB, 下载次数 Times of downloads: 3)

用法:在命令行输入 python plot_RDG.py -h ,会显示使用方法。
  1. >>> python plot_RDG.py -h
复制代码


其中 -h 表示帮助, -i 表示输入的限位符。用户可以在此限位符后输入文件的路径和文件名。如果文件名在当前路径,则可以忽略路径,直接输入文件名。

输入路径和文件名后,Python 程序会使用  Numpy 切片而不是 for 循环来筛选数据。此过程对于 1775000 行数据只需要 8.5 秒左右的时间。数据处理完后会在屏幕上打印时间。

然后,Python 会根据筛选后的数据绘图。

509

帖子

1

威望

4249

eV
积分
4778

Level 6 (一方通行)

5#
发表于 Post on 2022-9-11 17:22:16 | 只看该作者 Only view this author
本帖最后由 tjuptz 于 2022-9-11 17:31 编辑
乐平 发表于 2022-9-11 11:51
其实并不需要并行。
很多用到 Numpy 的脚本其实并没有将 Numpy 的优势发挥出来,而是用大量的 for 循环 ...

谢谢大佬的指教,我的脚本只是用了嵌套for循环从parmed读入的轨迹中的atom list来进行原子对之间的简单坐标运算,判断是否满足设定条件。看来问题可能不在于并行,而在于数据结构或者使用的库。我再看看parmed的atom list 对象底层是否是numpy实现的,思考下能否用切片功能代替for循环。

1063

帖子

0

威望

3277

eV
积分
4340

Level 6 (一方通行)

6#
发表于 Post on 2022-9-11 18:00:39 | 只看该作者 Only view this author
本帖最后由 乐平 于 2022-9-11 18:02 编辑
tjuptz 发表于 2022-9-11 17:22
谢谢大佬的指教,我的脚本只是用了嵌套for循环从parmed读入的轨迹中的atom list来进行原子对之间的简单坐 ...

我重新写了一个新脚本,你可以参考(上传了脚本,帖子在审核阶段,可能需要等一等才能看到)。

509

帖子

1

威望

4249

eV
积分
4778

Level 6 (一方通行)

7#
发表于 Post on 2022-9-11 18:13:47 | 只看该作者 Only view this author
本帖最后由 tjuptz 于 2022-9-16 13:59 编辑
乐平 发表于 2022-9-11 18:00
我重新写了一个新脚本,你可以参考(上传了脚本,帖子在审核阶段,可能需要等一等才能看到)。

谢谢大佬细致的指教,已下载学习。

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2024-11-27 21:36 , Processed in 0.195019 second(s), 24 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list