다음 파이썬 코드를 사용하여 일부 기능 값을 계산할 것입니다. 하지만 입력 크기가 너무 크기 때문에 시간이 많이 걸립니다. 코드 최적화를 도와주세요.
leaving_volume=len([x for x in pickup_ids if x not in dropoff_ids])
arriving_volume=len([x for x in dropoff_ids if x not in pickup_ids])
transition_volume=len([x for x in dropoff_ids if x in pickup_ids])
union_ids=list(set(pickup_ids + dropoff_ids))
busstop_ids=[x for x in union_ids if self.geoitems[x].fare>0]
busstop_density=np.sum([Util.Geodist(self.geoitems[x].orilat, self.geoitems[x].orilng, self.geoitems[x].destlat, self.geoitems[x].destlng)/(1000*self.geoitems[x].fare) for x in busstop_ids])/len(busstop_ids) if len(busstop_ids) > 0 else 0
busstop_ids=[x for x in union_ids if self.geoitems[x].balance>0]
smartcard_balance=np.sum([self.geoitems[x].balance for x in busstop_ids])/len(busstop_ids) if len(busstop_ids) > 0 else 0
안녕, 모든,
여기 내 수정 된 버전입니다. 내 GPS 추적 데이터에서이 코드를 실행합니다. 더 빠릅니다. 도움을
intersect_ids=set(pickup_ids).intersection(set(dropoff_ids))
union_ids=list(set(pickup_ids + dropoff_ids))
leaving_ids=set(pickup_ids)-intersect_ids
leaving_volume=len(leaving_ids)
arriving_ids=set(dropoff_ids)-intersect_ids
arriving_volume=len(arriving_ids)
transition_volume=len(intersect_ids)
busstop_density=np.mean([Util.Geodist(self.geoitems[x].orilat, self.geoitems[x].orilng, self.geoitems[x].destlat, self.geoitems[x].destlng)/(1000*self.geoitems[x].fare) for x in union_ids if self.geoitems[x].fare>0])
if not busstop_density > 0:
busstop_density = 0
smartcard_balance=np.mean([self.geoitems[x].balance for x in union_ids if self.geoitems[x].balance>0])
if not smartcard_balance > 0:
smartcard_balance = 0
많은 감사합니다.
np.sum이 목록에서 작동하는지 확실하지 않습니다. 또한, 파이썬 2.7 이하에서는 정수 나누기 (파이썬의 실제 버전을 모른다)를 사용합니다. 처음 세 표현은 두 세트의 차이점이며 한 세트 교차점은이를 사용합니다. 한 사이클 내에서 무엇이든하는 것은 그리 효율적이지 않습니다. 객체 목록 (geoitems) 대신 배열 또는 레코드 배열 사전을 사용하십시오. – Martin