[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 依山居 于 2015-11-12 07:27 编辑

并不明白你的说什么意思。

python是方便的语言。并不是处理速度快。大量数量使用readline读入,for 逐行迭代处理。
处理大量数据还要打印到输出,还要交互确认?。不慢才见鬼了。

修正一下,经过我在另的帖子中生成的数据来测试,几百M的文件不算大文件。只要内存不会爆掉,应该都一次读入内存处理。
逐行读,处理,逐行写,这样的顺序可能会很慢。

这个问题本质也是个文本格式化。

TOP

回复 3# winbat


    想不想写的问题而已。

TOP

回复 5# pcl_test


    楼主说的数量挺大的吧?版主你的代码都是一次读入处理后再写入文件的吗?

TOP

回复 10# 523066680


    我一直有囤有各种资料。但是就是不看。。。十年间几乎没有完整看过一本书,没有任何进步。

TOP

本帖最后由 依山居 于 2015-11-13 22:36 编辑

不小心生成了6百万行数据测试了下。这里的代码大约需要1020秒。将近17分钟。
  1. #python重复行数合并文件
  2. #题目来源: http://www.bathome.net/viewthread.php?tid=38017
  3. #依山居 4:22 2015/11/8
  4. #相关资料 Python按行读文件:
  5. #http://www.cnblogs.com/xuxn/archive/2011/07/27/read-a-file-with-python.html
  6. #相关资料 Python迭代器和生成器:
  7. #http://python.jobbole.com/81881/
  8. #python3 生成器
  9. #http://t.cn/R2GTPBY
  10. #Python关键字yield的解释
  11. #http://pyzh.readthedocs.org/en/latest/the-python-yield-keyword-explained.html
  12. #探寻Python中如何同时迭代多个iterable对象
  13. #http://blog.csdn.net/kxcfzyk/article/details/41380017
  14. #以下三个函数逐行读取对应文件,n为默认重复次数。
  15. def txta(txta="a.txt",n=6):
  16.     with open(txta) as fa:
  17.         for la in fa:
  18.             la=la.rstrip()+","
  19.             for r in range(n):
  20.                 yield la
  21.         
  22. def txtb(txtb="b.txt",n=3):
  23.     with open(txtb) as fb:
  24.         for lb in fb:
  25.             lb=lb.rstrip()+","
  26.             for r in range(n):
  27.                 yield lb
  28. def txtc(txt="c.txt",n=1):
  29.     with open(txt) as f:
  30.         for l in f:
  31.             l=l.rstrip()+"\n"
  32.             for r in range(n):
  33.                 yield l
  34. def merge(a,b,c,txt="test.txt"):
  35.     with open(txt,"a+") as f:
  36.         f.write(a+b+c)
  37.         #f.flush()
  38.         
  39. bt=txtb()
  40. at=txta()
  41. for c in txtc():
  42.     b=next(bt)
  43.     a=next(at)
  44.     merge(a,b,c)
  45. try:
  46.     input("执行完成,按回车退出")
  47. except SyntaxError:
  48.     pass
复制代码
1

评分人数

    • winbat: 非常感觉!技术 + 1

TOP

本帖最后由 依山居 于 2015-11-9 03:56 编辑

提升处理速度的办法是原文件拆分成多个任务,同时启动多个脚本分别处理。

TOP

回复 14# winbat


    不是。这是这最简单的办法。以及由于python的GIL ,好像写多线程比较麻烦。

TOP

  1. """
  2. 生成测试数据
  3. 依山居 19:46 2015/11/13
  4. python列表解析真好玩~
  5. """
  6. import time
  7. start=time.time()
  8. an=1
  9. bn=3
  10. cn=6
  11. x=1000000
  12. al=["%012d\n" % r for r in range(an*x)]
  13. bl=["%012d\n" % r for r in range(bn*x)]
  14. end=time.time()
  15. pt=end-start
  16. print("运行耗时1:",pt)
  17. cl=["%012d\n" % r for r in range(cn*x)]
  18. end=time.time()
  19. pt=end-start
  20. print("运行耗时2:",pt)
  21. atxt=open("aa.txt","w+")
  22. atxt.writelines(al)
  23. atxt.close()
  24. btxt=open("bb.txt","w+")
  25. btxt.writelines(bl)
  26. btxt.close()
  27. end=time.time()
  28. pt=end-start
  29. print("运行耗时3:",pt)
  30. ctxt=open("cc.txt","w+")
  31. ctxt.writelines(cl)
  32. ctxt.close()
  33. end=time.time()
  34. pt=end-start
  35. print("运行耗时:",pt)
  36. try:
  37.     input("按回车退出")
  38. except SyntaxError:
  39.     pass
复制代码
下载安装python3 https://www.python.org/downloads/ 代码存为xx.py 双击运行或IDLE打开F5运行

TOP

  1. """
  2. 每行数据重复N次合并生成新文件
  3. 依山居 0:54 2015/11/14
  4. 太困了,回头再改,6百万行,大约17秒。。。
  5. 非常流氓地使用了sorted排序数据。实际数据中估计不能使用.
  6. """
  7. import time
  8. start=time.time()
  9. an=6
  10. with open("aa.txt") as f:
  11.     ta=f.read()
  12.     ta=ta.rsplit()
  13.     al=[(r+",") for r in ta]*an
  14.     al=sorted(al)
  15. print(len(al))   
  16. bn=3
  17. with open("bb.txt") as f:
  18.     tb=f.read()
  19.     tb=tb.rsplit()
  20.     bl=[(r+",") for r in tb]*bn
  21.     bl=sorted(bl)
  22.    
  23. print(len(bl))   
  24. cn=1
  25. with open("cc.txt") as f:
  26.     tc=f.read()
  27.     tc=tc.rsplit()
  28.     cl=[r+"\n" for r in tc]
  29. print(len(cl))
  30. end=time.time()
  31. pt=end-start
  32. print("运行耗时:",pt)
  33. rn=len(cl)
  34. tal=[]
  35. for r in range(rn):
  36.     tal.append(al[r]+bl[r]+cl[r])
  37.    
  38. end=time.time()
  39. pt=end-start
  40. print("运行耗时:",pt)
  41. with open("out.txt","w+") as f:
  42.     f.writelines(tal)
  43.     f.close()
  44.    
  45. end=time.time()
  46. pt=end-start
  47. print("运行耗时:",pt)
  48. try:
  49.     input("按回车退出")
  50. except SyntaxError:
  51.     pass
复制代码
下载安装python3 https://www.python.org/downloads/ 代码存为xx.py 双击运行或IDLE打开F5运行

TOP

  1. """
  2. 每行数据重复N次合并生成新文件
  3. 题目来源 http://www.bathome.net/thread-38017-2-1.html
  4. 依山居 0:54 2015/11/14
  5. 这个版本可以使用来处理实际数据。。。6百万行,大约17秒。。。
  6. 总结:几百万行数据真不算多。不需要逐行读取处理。python列表解析是个好东西~
  7. 使用重复列表中元素更好的方法 http://www.oschina.net/question/96078_2141454
  8. python笔记_列表解析 http://www.jianshu.com/p/c635d3c798c2
  9. """
  10. import time
  11. start=time.time()
  12. an=6
  13. with open("aa.txt") as f:
  14.     ta=f.read()
  15.     ta=ta.rsplit()
  16.     al=[r+"," for r in ta for i in range(an)]
  17. print("al长度:",len(al))
  18. bn=3
  19. with open("bb.txt") as f:
  20.     tb=f.read()
  21.     tb=tb.rsplit()
  22.     bl=[r+"," for r in tb for i in range(bn)]
  23. print("bl长度:",len(bl))
  24. cn=1
  25. with open("cc.txt") as f:
  26.     tc=f.read()
  27.     tc=tc.rsplit()
  28.     cl=[r+"\n" for r in tc for i in range(cn)]
  29. print("cl长度:",len(cl))
  30. end=time.time()
  31. pt=end-start
  32. print("运行耗时:",pt)
  33. rn=len(cl)
  34. tal=[al[r]+bl[r]+cl[r] for r in range(rn)]
  35. #还是用列表解析好~
  36. #for r in range(rn):
  37. #   tal.append(al[r]+bl[r]+cl[r])
  38.    
  39. end=time.time()
  40. pt=end-start
  41. print("运行耗时:",pt)
  42. with open("out.txt","w+") as f:
  43.     f.writelines(tal)
  44.     f.close()
  45.    
  46. end=time.time()
  47. pt=end-start
  48. print("运行耗时:",pt)
  49. try:
  50.     input("按回车退出")
  51. except SyntaxError:
  52.     pass
复制代码
下载安装python3 https://www.python.org/downloads/ 代码存为xx.py 双击运行或IDLE打开F5运行

TOP

返回列表