ฉันกำลังมองหาคำแนะนำบางอย่างเกี่ยวกับวิธีทำให้โค้ดไพ ธ อนของฉันมีประสิทธิภาพมากขึ้น ปกติแล้วประสิทธิภาพไม่สำคัญสำหรับฉัน แต่ตอนนี้ฉันกำลังทำงานกับไฟล์ข้อความของสถานที่ในสหรัฐอเมริกาที่มีมากกว่า 1.5 ล้านคะแนน ด้วยการตั้งค่าที่กำหนดจะใช้เวลาประมาณ 5 วินาทีในการรันการทำงานในจุดเดียว ฉันต้องทำให้ตัวเลขนี้ลง
ฉันใช้ python GIS สามแพ็คเกจในการดำเนินการที่แตกต่างกันเล็กน้อยในจุดและส่งออกไฟล์ข้อความที่คั่นด้วยใหม่
- ฉันใช้ OGR เพื่ออ่านรูปร่างเขตแดนของเคาน์ตีและเข้าถึงเรขาคณิตของขอบเขต
- หุ่นดีตรวจสอบเพื่อดูว่ามีจุดอยู่ในมณฑลใด ๆ เหล่านี้
- ถ้ามันอยู่ภายในเดียวฉันใช้ Python Shapefile Library เพื่อดึงข้อมูลแอ็ตทริบิวต์จาก. dbf ขอบเขต
- ฉันจะเขียนข้อมูลบางอย่างจากทั้งสองแหล่งลงในไฟล์ข้อความ
ฉันสงสัยว่าการไร้ประสิทธิภาพอยู่ในการวนรอบ 2-3 ชั้น ... ไม่ค่อยแน่ใจว่าจะทำอย่างไรกับมัน ฉันกำลังมองหาความช่วยเหลือโดยเฉพาะกับใครบางคนที่ประสบกับการใช้งานแพ็กเกจทั้งสามนี้เพราะนี่เป็นครั้งแรกที่ฉันได้ใช้มัน
import os, csv
from shapely.geometry import Point
from shapely.geometry import Polygon
from shapely.wkb import loads
from osgeo import ogr
import shapefile
pointFile = "C:\\NSF_Stuff\\NLTK_Scripts\\Gazetteer_New\\NationalFile_20110404.txt"
shapeFolder = "C:\NSF_Stuff\NLTK_Scripts\Gazetteer_New"
#historicBounds = "C:\\NSF_Stuff\\NLTK_Scripts\\Gazetteer_New\\US_Counties_1860s_NAD"
historicBounds = "US_Counties_1860s_NAD"
writeFile = "C:\\NSF_Stuff\\NLTK_Scripts\\Gazetteer_New\\NewNational_Gazet.txt"
#opens the point file, reads it as a delimited file, skips the first line
openPoints = open(pointFile, "r")
reader = csv.reader(openPoints, delimiter="|")
reader.next()
#opens the write file
openWriteFile = open(writeFile, "w")
#uses Python Shapefile Library to read attributes from .dbf
sf = shapefile.Reader("C:\\NSF_Stuff\\NLTK_Scripts\\Gazetteer_New\\US_Counties_1860s_NAD.dbf")
records = sf.records()
print "Starting loop..."
#This will loop through the points in pointFile
for row in reader:
print row
shpIndex = 0
pointX = row[10]
pointY = row[9]
thePoint = Point(float(pointX), float(pointY))
#This section uses OGR to read the geometry of the shapefile
openShape = ogr.Open((str(historicBounds) + ".shp"))
layers = openShape.GetLayerByName(historicBounds)
#This section loops through the geometries, determines if the point is in a polygon
for element in layers:
geom = loads(element.GetGeometryRef().ExportToWkb())
if geom.geom_type == "Polygon":
if thePoint.within(geom) == True:
print "!!!!!!!!!!!!! Found a Point Within Historic !!!!!!!!!!!!"
print str(row[1]) + ", " + str(row[2]) + ", " + str(row[5]) + " County, " + str(row[3])
print records[shpIndex]
openWriteFile.write((str(row[0]) + "|" + str(row[1]) + "|" + str(row[2]) + "|" + str(row[5]) + "|" + str(row[3]) + "|" + str(row[9]) + "|" + str(row[10]) + "|" + str(records[shpIndex][3]) + "|" + str(records[shpIndex][9]) + "|\n"))
if geom.geom_type == "MultiPolygon":
for pol in geom:
if thePoint.within(pol) == True:
print "!!!!!!!!!!!!!!!!! Found a Point Within MultiPolygon !!!!!!!!!!!!!!"
print str(row[1]) + ", " + str(row[2]) + ", " + str(row[5]) + " County, " + str(row[3])
print records[shpIndex]
openWriteFile.write((str(row[0]) + "|" + str(row[1]) + "|" + str(row[2]) + "|" + str(row[5]) + "|" + str(row[3]) + "|" + str(row[9]) + "|" + str(row[10]) + "|" + str(records[shpIndex][3]) + "|" + str(records[shpIndex][9]) + "|\n"))
shpIndex = shpIndex + 1
print "finished checking point"
openShape = None
layers = None
pointFile.close()
writeFile.close()
print "Done"