- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的任务相对简单:对于输入文件中的每一行,测试该行是否满足给定的一组条件,如果满足,则将该行的特定列写入新文件。我已经编写了一个执行此操作的 python 脚本,但我想要一些帮助:1)提高速度,2)根据列名工作的最佳方式(因为列号可能因文件而异),以及 3 ) 指定过滤条件和所需输出列的最佳方式。
1) 我使用的文件包含天文图像的光度测量。每个文件大约有 1e6 行乘以 150 列 float ,通常大小超过 1GB。我有一个旧的 AWK 脚本,可以在大约 1 分钟内处理这样的文件;我的 python 脚本需要 5 到 7 分钟。我经常需要调整过滤条件并重新运行几次,直到输出文件是我想要的,所以速度绝对是可取的。我发现 for 循环非常快;这就是我在循环中做事情的方式,这会减慢它的速度。使用 itemgetter 只挑选出我想要的列比将整行读入内存有很大的改进,但我不确定我可以做些什么来进一步提高速度。这能像 AWK 一样快吗?
2) 我想根据列名而不是列号进行工作,因为特定数量(光子计数、背景、信噪比等)的列号可能会在文件之间发生变化。在我的 AWK 脚本中,我总是需要检查指定条件和输出列的列号是否正确,即使过滤和输出适用于相同的数量。我在 python 中的解决方案是创建一个字典,为每个数量分配一个列号。当一个文件有不同的列时,我只需要指定一个新的字典。也许有更好的方法来做到这一点?
3) 理想情况下,我只需要指定输入和输出文件的名称、过滤条件以及要输出的所需列,它们会在我的脚本顶部找到,所以我不需要去搜索代码只是为了调整一些东西。我的主要问题是 undefined variable 。例如,典型条件是“SNR > 4”,但“SNR”(信噪比)在开始从光度文件中读取行之前实际上并未分配值。我的解决方案是结合使用字符串和 eval/exec。同样,也许有更好的方法?
我根本没有接受过计算机科学方面的培训(我是一名天文学研究生)- 我通常只是将一些东西拼凑在一起并进行调试,直到它起作用。但是,针对我以上三点的优化对我的研究来说变得极其重要。对于冗长的帖子,我深表歉意,但我觉得细节会有所帮助。除了整理内容/编码风格之外,您对我的任何和所有建议都将不胜感激。
非常感谢, jack
#! /usr/bin/env python2.6
from operator import itemgetter
infile = 'ugc4305_1.phot'
outfile = 'ugc4305_1_filt.phot'
# names must belong to dicitonary
conditions = 'OBJ <= 2 and SNR1 > 4 and SNR2 > 4 and FLAG1 < 8 and FLAG2 < 8 and (SHARP1 + SHARP2)**2 < 0.075 and (CROWD1 + CROWD2) < 0.1'
input = 'OBJ, SNR1, SNR2, FLAG1, FLAG2, SHARP1, SHARP2, CROWD1, CROWD2'
# should contain all quantities used in conditions
output = 'X, Y, OBJ, COUNTS1, BG1, ACS1, ERR1, CHI1, SNR1, SHARP1, ROUND1, CROWD1, FLAG1, COUNTS2, BG2, ACS2, ERR2, CHI2, SNR2, SHARP2, ROUND2, CROWD2, FLAG2'
# dictionary of col. numbers for the more important qunatities
columns = dict(EXT=0, CHIP=1, X=2, Y=3, CHI_GL=4, SNR_GL=5, SHARP_GL=6, ROUND_GL=7, MAJAX_GL=8, CROWD_GL=9, OBJ=10, COUNTS1=11, BG1=12, ACS1=13, STD1=14, ERR1=15, CHI1=16, SNR1=17, SHARP1=18, ROUND1=19, CROWD1=20, FWHM1=21, ELLIP1=22, PSFA1=23, PSFB1=24, PSFC1=25, FLAG1=26, COUNTS2=27, BG2=28, ACS2=29, STD2=30, ERR2=31, CHI2=32, SNR2=33, SHARP2=34, ROUND2=35, CROWD2=36, FWHM2=37, ELLIP2=38, PSFA2=39, PSFB2=40, PSFC2=41, FLAG2=42)
f = open(infile)
g = open(outfile, 'w')
# make string that extracts values for testing
input_items = []
for i in input.replace(',', ' ').split():
input_items.append(columns[i])
input_items = ', '.join(str(i) for i in input_items)
var_assign = '%s = [eval(i) for i in itemgetter(%s)(line.split())]' % (input, input_items)
# make string that specifies values for writing
output_items = []
for i in output.replace(',', ' ').split():
output_items.append(columns[i])
output_items = ', '.join(str(i) for i in output_items)
output_values = 'itemgetter(%s)(line.split())' % output_items
# make string that specifies format for writing
string_format = []
for i in output.replace(',', ' ').split():
string_format.append('%s')
string_format = ' '.join(string_format)+'\n'
# main loop
for line in f:
exec(var_assign)
if eval(conditions):
g.write(string_format % tuple(eval(output_values)))
f.close()
g.close()
最佳答案
我认为您没有提到它,但看起来您的数据是 csv 格式的。使用 csv.DictReader 可能会收获很多.您可以一次遍历 1 行文件(避免将整个文件加载到内存中)并按名称引用列。
您还应该看看 cProfile ,Python 的分析器,如果您还没有的话。它会告诉您程序的哪些部分执行时间最长。
关于python - 超大文件的优化处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5121983/
比较代码: const char x = 'a'; std::cout > (0C310B0h) 00C3100B add esp,4 和 const i
您好,我正在使用 Matlab 优化求解器,但程序有问题。我收到此消息 fmincon 已停止,因为目标函数值小于目标函数限制的默认值,并且约束满足在约束容差的默认值范围内。我也收到以下消息。警告:矩
处理Visual Studio optimizations的问题为我节省了大量启动和使用它的时间 当我必须进行 J2EE 开发时,我很难回到 Eclipse。因此,我还想知道人们是否有任何提示或技巧可
情况如下:在我的 Excel 工作表中,有一列包含 1-name 形式的条目。考虑到数字也可以是两位数,我想删除这些数字。这本身不是问题,我让它工作了,只是性能太糟糕了。现在我的程序每个单元格输入大约
这样做有什么区别吗: $(".topHorzNavLink").click(function() { var theHoverContainer = $("#hoverContainer");
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is the cost of '$(this)'? 我经常在一些开发人员代码中看到$(this)引用同一个
我刚刚结束了一个大型开发项目。我们的时间紧迫,因此很多优化被“推迟”。既然我们已经达到了最后期限,我们将回去尝试优化事情。 我的问题是:优化 jQuery 网站时您要寻找的最重要的东西是什么。或者,我
所以我一直在用 JavaScript 编写游戏(不是网络游戏,而是使用 JavaScript 恰好是脚本语言的游戏引擎)。不幸的是,游戏引擎的 JavaScript 引擎是 SpiderMonkey
这是我在正在构建的页面中使用的 SQL 查询。它目前运行大约 8 秒并返回 12000 条记录,这是正确的,但我想知道您是否可以就如何使其更快提出可能的建议? SELECT DISTINCT Adve
如何优化这个? SELECT e.attr_id, e.sku, a.value FROM product_attr AS e, product_attr_text AS a WHERE e.attr
我正在使用这样的结构来测试是否按下了所需的键: def eventFilter(self, tableView, event): if event.type() == QtCore.QEven
我正在使用 JavaScript 从给定的球员列表中计算出羽毛球 double 比赛的所有组合。每个玩家都与其他人组队。 EG。如果我有以下球员a、b、c、d。它们的组合可以是: a & b V c
我似乎无法弄清楚如何让这个 JS 工作。 scroll function 起作用但不能隐藏。还有没有办法用更少的代码行来做到这一点?我希望 .down-arrow 在 50px 之后 fade out
我的问题是关于用于生产的高级优化级联样式表 (CSS) 文件。 多么最新和最完整(准备在实时元素中使用)的 css 优化器/最小化器,它们不仅提供删除空格和换行符,还提供高级功能,如删除过多的属性、合
我读过这个: 浏览器检索在 中请求的所有资源开始呈现 之前的 HTML 部分.如果您将请求放在 中section 而不是,那么页面呈现和下载资源可以并行发生。您应该从 移动尽可能多的资源请求。
我正在处理一些现有的 C++ 代码,这些代码看起来写得不好,而且调用频率很高。我想知道我是否应该花时间更改它,或者编译器是否已经在优化问题。 我正在使用 Visual Studio 2008。 这是一
我正在尝试使用 OpenGL 渲染 3 个四边形(1 个背景图,2 个 Sprite )。我有以下代码: void GLRenderer::onDrawObjects(long p_dt) {
我确实有以下声明: isEnabled = false; if(foo(arg) && isEnabled) { .... } public boolean foo(arg) { some re
(一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(no
一、写在前面 css的优化方案,之前没有提及,所以接下来进行总结一下。 二、具体优化方案 2.1、加载性能 1、css压缩:将写好的css进行打包,可以减少很多的体积。 2、css单一样式:在需要下边
我是一名优秀的程序员,十分优秀!