- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:Python 2.7.8
我有两个文件。 p_m 有几百条记录,其中包含第 2 列中的可接受值。p_t 有数千万条记录,我想确保其中第 14 列来自已经提到的可接受值集合。因此,在第一个 while 循环中,我读取所有可接受的值,制作一个集合(用于重复数据删除),然后将该集合转换为列表(我没有进行基准测试来查看集合是否会比实际上是一个列表......)。我在第二个循环中将其减少到尽可能少的行,但我不知道它们是否是最快的几行(我使用 [14] 索引两次,因为异常非常罕见,所以我没有'不想为变量赋值而烦恼)。目前,扫描大约需要 40 分钟。关于如何改进的任何想法?
def contentScan(p_m,p_t):
""" """
vcont=sets.Set()
i=0
h = open(p_m,"rb")
while(True):
line = h.readline()
if not line:
break
i += 1
vcont.add(line.split("|")[2])
h.close()
vcont = list(vcont)
vcont.sort()
i=0
h = open(p_t,"rb")
while(True):
line = h.readline()
if not line:
break
i += 1
if line.split("|")[14] not in vcont:
print "%s is not defined in the matrix." %line.split("|")[14]
return 1
h.close()
print "PASS All variable_content_id values exist in the matrix." %rem
return 0
最佳答案
检查包含数百个项目的集合
中的成员资格比检查等效列表
中的成员资格快得多。然而,考虑到您惊人的 40 分钟运行时间,差异可能并没有那么有意义。例如:
ozone:~ alex$ python -mtimeit -s'a=list(range(300))' '150 in a'
100000 loops, best of 3: 3.56 usec per loop
ozone:~ alex$ python -mtimeit -s'a=set(range(300))' '150 in a'
10000000 loops, best of 3: 0.0789 usec per loop
因此,如果您要检查“数千万次”,使用该集合应该可以节省数十秒——总比没有好,但几乎无法衡量。
同样的考虑也适用于其他非常可取的改进,例如改变循环结构:
h = open(p_t,"rb")
while(True):
line = h.readline()
if not line:
break
...
h.close()
变得更加时尚:
with open(p_t, 'rb') as h:
for line in h:
...
同样,每次迭代不会为您节省一微秒——因此,比方说,超过 5000 万行,这还不到 40 分钟中的一分钟。删除完全未使用的 i += 1
也是如此 - 它在那里没有任何意义,但采取它的方式不会有什么区别。
一个答案集中在split
操作的成本上。这取决于每条记录有多少个字段,但是,例如:
ozone:~ alex$ python -mtimeit -s'a="xyz|"*20' 'a.split("|")[14]'
1000000 loops, best of 3: 1.81 usec per loop
所以,再次强调,这里的任何优化可能每次迭代最多可以节省一微秒——如果是这样的话,又可以节省一分钟。
实际上,这里的关键问题是为什么读取和检查例如 5000 万条记录每行需要花费 40 分钟 - 2400 秒 - 48 微秒;毫无疑问,即使进行了此处以及其他答案和评论中提到的所有优化,每行仍然超过 40 微秒。
因此,一旦您应用了所有优化(并确认代码仍然太慢),请尝试对程序进行分析 - 例如 http://ymichael.com/2014/03/08/profiling-python-with-cprofile.html -- 准确找出所有时间都去哪儿了。
此外,为了确保它不仅仅是某些特别慢的磁盘的 I/O,请使用“注释掉”的大循环的重要部分进行运行 - 只是读取大文件,并且不进行任何处理或检查一切都在它上面;这将告诉您“不可减少的”I/O 开销是多少(如果 I/O 占用了您大部分时间,那么您无法做太多改进,尽管将 open 更改为 open(thefile ,'rb',HUGE_BUFFER_SIZE)
可能会有所帮助),并且可能需要考虑改进硬件设置 - 对磁盘进行碎片整理,使用本地而不是远程文件系统,等等......
关于python - 我怎样才能让这个Python文件扫描得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29036612/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!