テーブルに数値がたくさんあるので、カラムを抽出してmax()を行うことができますが、おそらく、カーネル内の方法を使ってこれを行う方法があります。ちょうど傾けることはそれを見つけるようである。pytablesの "select max(column)from table"と同じもの
2
A
答えて
6
を、あなたの代わりにiterrowsメソッドを使用して二回速く結果をオーバー達成することができますof:
In [117]: timeit max(row['timestamp'] for row in table.iterrows(stop=1000000))
1 loops, best of 3: 1 s per loop
In [118]: timeit max(row['timestamp'] for row in table.where('(timestamp<=Tf)'))
1 loops, best of 3: 2.21 s per loop
In [120]: timeit max(frames.cols.timestamp[:1000000])
1 loops, best of 3: 974 ms per loop
In [121]: timeit np.max(frames.cols.timestamp[:1000000])
1 loops, best of 3: 876 ms per loop
上記のTfは1000000のエントリですfその列(これはFloat64です)。
質問は比較チェックを要求しないので、どこのテストをスペアすることができますか... 質問で提案された方法(numpy配列としてデータをロードする方法)はまだまだ高速です3%未満で、大きなデータセットの場合はさらに小さくなりますが、10^7行以上はテストしませんでした)。 最高の結果max numpy関数を使用する場所がわかりました(上記参照)。
さらに効率的な方法を学ぶこともできます。
1
High Performance Data Management with PyTables & Family(PDF)から:
e = sum(row['col1'] for row in table.where(3<table.cols.col2<=20))
max()
使用するためにこれを変更する:私が作ったテストでは
e = max(row['col1'] for row in table.where(3<table.cols.col2<=20))
2
私はこれを行うために見つけた最速の方法は、あなたが興味を持っているcolsの上のあなたのテーブルのインデックスを作成することです:インデックス付けたら
table.cols.timestamp.createCSIndex()
、最大を取得することは、ほぼ瞬時です:
max_timestamp = table.cols.timestamp[table.colindexes['timestamp'][-1]]
これは、最初にタイムスタンプ列(table.colindexes['timestamp'][-1]
)のテーブルのIndexオブジェクトから最後の(最大のタイムスタンプに対応する)行インデックスを取得し、対応する列参照にインデックスを付けることによって指す行をフェッチしますtable.cols.timestamp
)。
関連する問題
- 1. Select * from table where column1 LIKE column2
- 2. Select * from table not working SQL
- 3. SELECT * FROMテーブルが少なくとも3つ同じです
- 4. Java resultset max column?
- 5. SELECT column FROM tab1 where test = test AND(SELECT col FROM tab2 where qwe = qwe)?出来ますか?
- 6. xml-data from text-column
- 7. LINQからSQLへのSELECT MIN(ZoneMin)、MAX(ZoneMin)FROM Plant`
- 8. SQL select column equivalence
- 9. ファイアバードSP、SELECT * FROM "TABLE"の操作方法は?
- 10. DataGrid Select Column
- 11. SELECT MAX(... PHP/MYSQL
- 12. Oracle create table with column comments
- 13. SQL Server:ALTER TABLE ADD COLUMN MAXDOP = 1
- 14. SELECT SUM()()(SELECT(SELECT FROM)
- 15. select count(*)from select
- 16. jQuery select from select
- 17. Linqの "SELECT SYSTEM_USER"と同等のもの
- 18. LEFT OUTER JOIN(SELECT * FROM TABLE)は可能ですか?
- 19. linq - from in select
- 20. select * from subquery
- 21. Flex SQL Select Max
- 22. SELECT MAX of COUNT
- 23. select max codeigniter
- 24. SELECT MAX(col_name)とROWNUM = 1の間のパフォーマンス
- 25. jquery select from get()insert
- 26. Microsoft SQL Server select select from insert
- 27. Select ID where Table Row Count = 1
- 28. Zend Db Table Abstract select()
- 29. Oracle - なぜSELECT * FROM Fooですか;とても遅いです?
- 30. SELECT FROMビューの内部WHERE
これは動作しますが、これは完全にカーネルではありませんか? where句が大きなセットを返す場合、大きな配列に対してmax()を実行することと等価になります。これはさらに最適化できますか? – jagguli
PyTablesはネイティブで集約関数をサポートしていないようです。 'table.where()'はイテレータを返します。したがって、テーブル全体をメモリに取り込まないでしょう。内部的には、その時点で1つのレコードを読み取り、それを生成します。 "カーネル内"は、 'table.where()'に渡される条件にのみ適用されます。 –