최근 에 사람들 을 도와 순환 최적화 문 제 를 해결 하 다.

요 이틀 동안 임 무 를 맡아 순환 최적화 문 제 를 해결 하 는 것 을 돕다.
개발 과 연락 해서 알 고 보 니 이런 일 이 었 다.데이터 베 이 스 는 비교적 느 리 기 때문에, 이 사람들 은 데 이 터 를 메모리 에 넣 어 처리 하기 로 결정 했다.10w 줄 정도 의 시계 두 장 에 포 함 된 순환 을 썼 습 니 다.
데이터베이스 데이터 로 메모리 불 러 오기 라 는 말 을 듣 고 memcached 캐 시 를 추가 할 수 있 는 지 생각 났 습 니 다.그러나 sql 을 보 니 각종 복잡 한 논리 와 다 중 표 연결 은 됐 습 니 다.
나 는 그 에 게 너의 이 생각 은 완전히 정확 하지 않다 고 말 했다.데이터베이스 에 문제 가 있 으 면 sql 을 설명해 야 합 니 다. 도대체 어디 가 느 린 지...메모리 불 러 오 는 일 은 vfs 층 의 캐 시 시스템 이 이 루어 져 야 합 니까?만약 당신 이 데이터 베 이 스 를 모두 메모리 에 불 러 와 처리 하고 싶다 면, rdbms 를 만 드 는 것 과 같 지 않 습 니까? 제 가 무슨 능력 이 있 겠 습 니까?
그리고 나 서 나 는 그 에 게 이 메모리 안의 데 이 터 를 데이터 원본 과 동기 화 할 것 이 냐 고 물 었 다.그 는 데 이 터 를 꺼 내 써 서 다 쓰 면 잃 어 버 리 겠 다 고 말 했다.
좋아요.색인 같은 것 도 의미 가 없 나 봐 요.
마지막 으로 그 에 게 O (m + n) 의 알고리즘 을 줄 수 밖 에 없 었 다.demo 를 만들어 서 그 에 게 회색 과 간단 한 것 을 주 었 다.
#!/usr/bin/env python
#coding:utf-8
#    data1 data2  key    。                    。        sql    
#     sql    :
#select * from data1 where data1.value<5 and data2.value like 'a%' and data1.key=data2.key
import random
#---------------------------------------------
class Data1(object):
    '''
           
    '''
    __slot__=('key','value')
    def __init__(self,key,value):
        self.key=key
        self.value=value
    def __str__(self):
        return str((self.key,self.value))
    def __repr__(self):
        return str((self.key,self,value))
class Data2(object):
    '''
           
    '''
    __slot__=('key','value')
    def __init__(self,key,value):
        self.key=key
        self.value=value
    def __str__(self):
        return str((self.key,self.value))
    def __repr__(self):
        return str((self.key,self.value))
#-------------------------------------------
#where     ,           。       ,       ,   bool      
class WhereStratege(object):
    @staticmethod
    def judge(data):
        pass
class Little_Then_5(WhereStratege):
    @staticmethod
    def judge(data):
        if data.value<5:
            return True
        else:
            return False
class Begin_With_A(WhereStratege):
    @staticmethod
    def judge(data):
        if data.value.startswith('a'):
            return True
        else:
            return False
       
#------------------------------------------------------
#            。python    hashtable         。.net       hashtable   。
# System.Collectons      。  hashtable            。               
#      ,           。          hashtable        。    hashtable 
#      。     load factor     。     hashtable                    
#     。     2、3            。                 ,  hashtable  
#    。                ,                    。      hashtable
#      O(1) 。
#  demo   result      。                  。     struct    。     
#                  。             。  ,          。       
#     。                ,      ,    hashtable    。      ,   
#    hashtable。       ,       。
#         hash        ,     。                。python       。
#  ,hashtable             ,        ,             ,          。
def connect_data(data_list1,data_list2,method1,method2):
    hashtable={}
    result=[]
    for data in data_list1:
        if method1.judge(data):
            hashtable[data.key]=data
    for data in data_list2:
        if data.key not in hashtable:
            continue
        elif method2.judge(data):
            result.append(hashtable[data.key])
    return result
#---------------------------------------------------------
#    10*10  ,          。         ,      O(m+n) ,demo          。
#     key value    10    。     key 5~14  ,value abc       。
#            ,                    。       ,         。
def gen_string(length,chartable):
    '''
     chartable               length    
    '''
    return ''.join([random.choice(chartable) for i in range(length)])
def test():
    '''
           
    '''
    keylist1=range(10)
    keylist2=range(5,15)
    valuelist1=range(10)
    valuelist2=[gen_string(3,['a','b','c']) for i in range(10)]
    random.shuffle(keylist1)
    random.shuffle(valuelist1)
    random.shuffle(keylist2)
    datalist1=map(Data1,keylist1,valuelist1)
    datalist2=map(Data2,keylist2,valuelist2)
    print '       :
' for data in datalist1: print data print '
:
' for data in datalist2: print data print '
:
' r=connect_data(datalist1,datalist2,Little_Then_5,Begin_With_A) for data in r: print data if __name__=='__main__': test()

좋은 웹페이지 즐겨찾기