用字典替代雙重迴圈實現快速查詢
1、需求是比對兩個檔案然後將具有的相同行寫入另一個檔案(大概是這個意思);最直接的的做法肯定是雙重迴圈分別遍歷然後比較行是否相同,相同則寫入,對於較小的檔案還可以忍受,對於相對較大的幾萬甚至幾十萬的處理起來速度不可謂不慢,慢到難以忍受!然後如何實現快速查詢呢,想到利用字典(速度快了不只幾百倍啊!):其原理是先在字典的索引表裡(比如部首表)查這個行對應的頁碼,然後直接翻到該頁,找到這一行,無論找哪一行,這種查詢速度都非常快,不會隨著字典大小的增加而變慢。
2、具體例項程式碼(基於python)
import codecs
import os
#定義字典
dic=dict()
#根據檔案一建立字典
img_full_path = '/home/ubuntu/handle1.txt'
ann_file = codecs.open(img_full_path, 'r', encoding='utf-8')
lines = ann_file.readlines()
q=open("./handle01.txt","w")
count=0
#按行建立字典(這裡的一行中間有空格分成兩部分)
for path in lines:
image_text = path.strip('\n').split(' ')
text_path = image_text[0]
dic[text_path]=path #一行的第一部分作為鍵,整體一行作為值
#print dic
#根據檔案二查詢字典
dir="/home/ubuntu/handle1"
for root, dirs, files in os.walk(dir):
for name in files:
if count%200==0:
print count
img_path=os.path.join(root,name)
if dic.has_key(img_path): #判斷鍵是否存在,這裡還有一種方法為 if img_path in dic.keys()
q.write(dic.get (img_path))#寫入檔案三
count+=1
3、效率對比:
因為這裡處理的檔案都是幾十萬行的,處理速度相差實在太大,就不在展示;
4、字典原理
dict內部存放的順序和key放入的順序是沒有關係的。
查詢和插入的速度極快,不會隨著key的增加而增加;
需要佔用大量的記憶體,記憶體浪費多。
dict是用空間來換取時間的一種方法。
dict的key必須是不可變物件。這是因為dict根據key來計算value的儲存位置,如果每次計算相同的key得出的結果不同,那dict內部就完全混亂了。這個通過key計算位置的演算法稱為雜湊演算法(Hash)。要保證hash的正確性,作為key的物件就不能變。在Python中,字串、整數等都是不可變的,因此,可以放心地作為key。而list是可變的,就不能作為key;
總結:知道有這麼個東西,但是當實際需求的時候卻不一定立刻想得起來,還是欠思考、用的少啊!
相關推薦
用字典替代雙重迴圈實現快速查詢
1、需求是比對兩個檔案然後將具有的相同行寫入另一個檔案(大概是這個意思);最直接的的做法肯定是雙重迴圈分別遍歷然後比較行是否相同,相同則寫入,對於較小的檔案還可以忍受,對於相對較大的幾萬甚至幾十萬的處理起來速度不可謂不慢,慢到難以忍受!然後如何實現快速查詢呢,想
15-二分查詢(上):圖和用最省記憶體的方式實現快速查詢功能?
今天我們講一種針對有序資料集合的查詢演算法:二分查詢(Binary Search)演算法,也叫折半查詢演算法。二分查詢的思想非常簡單,很多非計算機專業的同學很容易就能理解,但是看似越簡單的東西往往越難掌握好,想要靈活應用就更加困難。 老規矩,我們還是來看一道思考
Java實現快速查詢某個範圍內的所有素數
Java實現快速查詢某個範圍內的所有素數 前言 定義法 篩選法 篩選優化法 後記 前言 素數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。定義非常簡單,但是它卻難以定量化,研究起來非常複雜,有興趣的可以買本研究
組合語言-偏移地址綜合應用-雙重迴圈實現
要求: db '1.helloworld ' db '2.apple ' db '3.stevejobs ' db '4.macbook ' 將上述內容從第三個資料開始向後三個都變成大寫,結果如下:
php迴圈實現折半查詢
<?php function binarySearch($arr, $num){ $left = 0; $right = count($arr) - 1; while($left <= $right){
利用遞迴和迴圈實現快速排序
#include <iostream> #include <queue> using namespace std; typedef std::pair<int ,int> queue_data; queue<queue_data>
用java的for迴圈實現列印上下兩個正反三角形
程式碼如下: import java.util.*; public class Circle { public static void main(String args[]) { int n
控制檯文字矩陣、菱形排列(充分展示用邏輯替代內迴圈的處理技巧)
那個矩陣排列確費不少腦力哦,菱形用陣列倒序填,這些例子都是給初學參考。 var 陣列 = Enumerable.Repeat(0, 7).ToArray();
Memorise Me!——用數值做地址,實現快速查找
pri ssi orm rip ++ print c++ 效率 大小 題目如下: Arijit is a brilliant boy. He likes memory games. He likes to participate alone but this time h
分別用遞迴、迴圈、bisect實現二叉查詢(python實現)
1、遞迴實現二叉查詢 def binary_search_recursion(lst,target,low,high): if high < low: return None middle = (low + high)//2 if lst[middl
python用字典實現switch..case類似的函數調用
python info 調試 turn return 字典 elif 實現 不同 python中沒有swich..case,若要實現一樣的功能,又不想用if..elif來實現,可以充分利用字典進行實現 主要是想要通過不同的key調用不同的方法,在學習過程中,發現不管輸入的k
【python基礎】用字典做一個小型的查詢數據庫
import oot 字符 odin 參數錯誤 err 輸出 put 異常 例子來源於《python基礎教程》第三版,57p 該例子主要是使用字典的方式,實現一個小型的數據庫,通過查詢字典的鍵值來獲取用戶的信息。 本人修改了部分代碼。 #!/usr/bin/python3
Sphinx 實現海量資料的快速查詢
來源:https://blog.csdn.net/qq_28018283/article/details/72622003 說到 Sphinx,就會想到:站內搜尋,mysql優化,分詞 等等有關搜尋海量資料的需求,本文介紹了 sphinx的基本概念
記用AWK進行for迴圈查詢文字時候的問題
今天剛剛接觸awk,就想著來實驗一下,當學到for迴圈的時候,我就簡單的操作了一下 1.txt 文字如下 1 haha heihei houhou 2 yannie2 yannie3 yannie4 3 hilary2 hilary3 hilary4 4 czl2 czl3 cz
用Python實現二分查詢
二分查詢(分遞迴和非遞迴) def binary_search(alist, item): """二分查詢,遞迴""" n = len(alist) if n > 0: mid = n//2 if alist[mid] ==
用DOM解析XML ,用xpath快速查詢XML節點
XPath是一種快速查詢xml節點和屬性的一種語言,Xpath和xml的關係就像是sql語句和資料庫的關係。用sql語句可以從資料庫中快速查詢出東西同樣的用xPath也可以快速的從xml中查詢出東西。 下面的示例演示了怎麼用jdk自帶的rt.jar完成dom解析 程式碼如下: test.xml的程式碼如
js實現快速排序,二分查詢 (詳解,一次學會)
js中幾大演算法,最近看到網上各路大神的解答,都蠻好的,自己也來玩一玩 一,快速排序 大致分三步: 在資料集之中,選擇一個元素作為"基準"(pivot)。 所有小於"基準"的元素,都移到"基準"的左邊;所有大於"基準"的元素,都移到"基準"的右邊。 對"基準"左邊和右邊的兩個子集,不斷重複
MYSQL JDBC快速查詢響應的方法,快速返回機制的實現
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
用for迴圈實現九九乘法表
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css">
超圖supermap sdx資料庫用sql實現空間查詢
在此介紹用sql對超圖的空間資料庫(sdx)進行空間查詢,優點如下: 1。超圖推薦的方式是用iobject,此方法要引入iobject 2。超圖另一個推薦的方式是用iserver的REST介面,但web介面缺點在於效能一般,尤其是返回資料比較多以及併發頻繁的情況下效能不好