0

複数のワークシートを使用して、Google スプレッドシートから都市名、道路名、およびそれらの間の距離を読み取るアプリケーションを作成したいと考えています。

これまでのところ、次のコードが正しく機能しています。スプレッドシートから読み取り、2 つの都市間の道路名 (Rode 60 など) とそれらの間の距離を知りたいユーザーからの入力も受け取ります。ただし、アプリケーションを実行すると、信じられないほど遅くなります。

サーバー側とユーザー側の問題があると思いますが、大量のドキュメントを読んだ後、非常に混乱しています。たぶん、まったく別のアプローチを検討する必要があります。おそらく、gspread を使用してすべてのスプレッドシートを読み取り、ユーザー側のみで作業する必要があります。ともかく。今は遅いので、後でスプレッドシートに何千もの都市を入れたいと思っています。おそらく、田舎道なのか、高速道路や国道なのかなど、それらに関するデータをさらに追加する予定です。現在のコードで結果が返されます。

私がpython、wxPython、Google API、またはIGraphを使用するのは初めてなので、グラフでこれらのことを行うべきだと提案した場合は、助けてください。今日、私は Python 2.7 用に IGraph もセットアップしました。多分それは私の問題の鍵ですか?少なくとも正しい方法、正しいチュートリアルを教えてください。誰かが私のために汚い仕事をしてくれるとは思っていません。前もって感謝します!!!

import gdata.spreadsheet.service
import gdata.service
import atom.service
import gdata.spreadsheet
import atom
import gspread
import wx
import gdata.docs
import gdata.docs.service
import re
import os
import csv
import math

class laci(wx.Frame):

    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,'distance calculator',size=(500,500))
        panel=wx.Panel(self)

        test=wx.TextEntryDialog(None,"Beginning point: ",'Name of beginning point','...')
        if test.ShowModal()==wx.ID_OK:
            all1=test.GetValue()

        test2=wx.TextEntryDialog(None,"Finishing point: ",'Name of finish','...')
        if test2.ShowModal()==wx.ID_OK:
            all2=test2.GetValue()



        c = gspread.Client(auth=('......@gmail.com','.............'))
        c.login()
        # open spreadsheet
        sht=c.open_by_key('.................................')
        worksheet = sht.get_worksheet(0)

        print worksheet

        i = 1
        j = 1

        What = None



        first_col = worksheet.col_values(1)
        print first_col
        stopper = 0
        n = 3
        m = 3

        while worksheet.cell(i,1).value != None and stopper != 1:
            if worksheet.cell(i,1).value == all1:
                print all1
                stopper = 1
            else:
                i = i+1
                print i
            if worksheet.cell(i,1).value == None:
                boxy=wx.MessageDialog(None,'Wrong start point. You wanna see correct start points list?','Mistake?',wx.YES_NO)
                answer=boxy.ShowModal()
                boxy.Destroy
                if answer == 5103:
                    boxl=wx.SingleChoiceDialog(None,'Accepted Starting point names:','In case of mistake',
                                               ['City1','City2','City3','City4','City5','City6','City7','City8'])
                    if boxl.ShowModal()==wx.ID_OK:
                        all1=boxl.GetStringSelection()
                        stopper = 0 # figyelj
                        i = 1
                        print all1
                    boxl.Destroy
                else:
                    print 'how unfortunate'
            if stopper == 1:
                sline = []
                while worksheet.cell(i,n).value != None:
                    line = worksheet.cell(i,n).value
                    sline.append(line)

                    n = n + 1
                    print sline
                    slinestr = str(sline) 


        stopper2 = 0
        print sline
        while worksheet.cell(j,1).value != None and stopper2 != 1:
            if worksheet.cell(j,1).value == all2:
                print all2
                stopper2 = 1
            else:
                j = j+1
                print j
            if worksheet.cell(j,1).value == None:
                boxz=wx.MessageDialog(None,'Wrong Finish point? Wanna see correct choices?','Mistake?',wx.YES_NO)
                answer2=boxz.ShowModal()
                boxz.Destroy
                if answer2 == 5103:
                    boxl2=wx.SingleChoiceDialog(None,'Accepted Finishing point names:','In case of mistake',
                                                ['City1','City2','City3','City4','City5','City6','City7','City8'])
                    if boxl2.ShowModal()==wx.ID_OK:
                        all2=boxl2.GetStringSelection()
                        print all2
                    boxl2.Destroy
                else:
                    print 'how unfortunate'
            if stopper2 == 1:
                sline2 = []
                while worksheet.cell(j,m).value != None:
                    line2 = worksheet.cell(j,m).value
                    sline2.append(line2)
                    m = m + 1
                    print sline2
                    slinestr2 = str(sline2)


        print sline
        print sline2
        t = list(set(sline) & set(sline2))
        print t
        t = t[0]
        t = str(t)
        worksheet2 = sht.worksheet(t)
        print worksheet2
        print worksheet2.cell(2,2)
        i = 2
        j = 2
        iszam = 1
        iszam2 = 1
        stopi = 0
        stopi2 = 0
        km = 0
        while worksheet2.cell(i,2).value != None and stopi != 1:
            if worksheet2.cell(i,2).value == all1:
                iszam = i
                print iszam
                print worksheet2.cell(i,3)
                stopi = 1
            i = i + 1
            print i
        while worksheet2.cell(j,2).value != None and stopi2 != 1:
            if worksheet2.cell(j,2).value == all2:
                iszam2 = j
                print iszam2
                print worksheet2.cell(j,3)
                stopi2 = 1
            j = j + 1
            print j
        if iszam2 < iszam:
            while iszam2 != iszam:
                km = km + int(worksheet2.cell(iszam2+1,3).value)
                iszam2 = iszam2 + 1
            print km

        elif iszam2 > iszam:
            while iszam != iszam2:
                km = km + int(worksheet2.cell(iszam+1,3).value)
                iszam = iszam + 1
            print km
        else:
            km = 0
            print km

        km = str(km)            
        wx.StaticText(panel, -1, all1, (20,30))
        wx.StaticText(panel, -1, slinestr, (80,30))
        wx.StaticText(panel, -1, all2, (20,60))
        wx.StaticText(panel, -1, slinestr2, (80,60))
        wx.StaticText(panel, -1, 'Path =', (20,90))
        wx.StaticText(panel, -1, t, (80,90))
        wx.StaticText(panel, -1, 'Distance =', (20,120))
        wx.StaticText(panel, -1, km, (80,120))


if __name__=='__main__':
    app=wx.PySimpleApp()   #runs it
    frame=laci(parent=None,id=-1)   #face of programme
    frame.Show()
    app.MainLoop()
4

1 に答える 1

0

私見を開始する最初の場所は、遅延がどこにあるかを見つけることです。

コードを別の関数/メソッドに移動することから始めます。これにより、コードをプロファイリングして、どこが遅いかを確認できます。

例えば。(おそらくこれ以上分解したい)

  • コンストラクターで wx オブジェクトをセットアップするだけです
  • 次に、Googleと通信する機能を持っています
  • もう 1 つはデータを wx に書き込むためのものです。

その後、自分で、または python プロファイラー ( http://docs.python.org/2/library/profile.html ) を使用して、プロファイリングを行うことができます。最も重要なことは、時間がかかっているものを見つけることです。そうすれば、改善が必要なものがわかります。

私の推測では、すべてをリモートで実行するのではなく、すぐに必要になると思われるものをできるだけ多く取得してから、ローカルで検索する必要があります。各関数がスプレッドシートで呼び出されても驚かないからです。サーバーとの通信になります。しかし、私はGoogle Spreadsheet APIを使用していないので、それは単なる勘です

于 2012-12-05T15:22:21.123 に答える