2016-06-24 10 views
0

Pythonにはヒープからメモリのブロックを取得し、それを参照する変数を使用する方法はありますか?ただ、「新しい」キーワード、または他の言語の機能malloc()のように:プロジェクトでPythonでメモリを動的に割り当てる方法

Object *obj = (Object *) malloc(sizeof(Object)); 
Object *obj = new Object(); 

、私のプログラムは、不確実な間隔で、正しいバイトの一定の長さのいくつかのデータを受信するために待機しています。

私はこのようにそれを使用:

void receive()// callback 
{ 
    if(getSize()<=sizeof(DataStruct)) 
    { 
    DataStruct *pData=malloc(sizeof(DataStruct)); 
    if(recvData(pData)>0) 
    list_add(globalList,pData); 
    } 
} 

void worker() 
{ 
    init() 
    while(!isFinish) 
{ 
    dataProcess(globalList); 
} 

} 

は今、私のpythonにこれらの古いプロジェクトを移行したい、と私はこのようにそれを実行しようとしました。しかし

def reveive(): 
data=dataRecv() 
globalList.append(data) 

、私が取得リスト内のすべてのアイテムは同じで、最新の受信アイテムと同じです。すべてのリストアイテムが同じメモリアドレスを指していることは明らかであり、関数が呼び出されるたびに新しいメモリアドレスを取得したい。

+0

pythonでglobalListとは何ですか?ローカル変数? – Boiethios

+2

問題を正しい方法で解決しようとしていません。 Pythonはより高いレベルの言語であり、メモリをまったく割り当てません。あなたが 'dataRecv'定義を表示したら(実際には - mcveを呼び出してください)、実際の問題*が何であるかがはっきりしているかもしれません。私の推測では、新しいリストを作成するのではなく、単一のリストオブジェクトを空にして再利用しています。おそらくあなたは恐ろしい[変更可能なデフォルト引数]を持っているでしょう(http://stackoverflow.com/q/1132941/3001761)。 – jonrsharpe

+0

ありがとう、dataRecvは別のインポートモジュールからのもので、dataRecv.Iを呼び出すために使用した引数を省略しています。reveive()でデータを出力しました。そうです。あなたが言うように、私は新しいリストオブジェクトを作成していません。私は尋ねる、私はC + +でキーワード "新しい"を達成するためのメソッドが必要 –

答えて

1

Python tutorialをお読みください。

リスト、辞書、オブジェクト、クロージャをPythonで作成できます。これらはすべて(Python)heapにあり、Pythonには純粋なgarbage collector(参照カウント+循環性のマーキング)があります。

それは洗練されたGC技術を使用していないので、(PythonのGCはナイーブである。したがって、それは例えばOCamlのか、多くのJVM世代コピーガベージコレクタよりも遅くなり、より多くのためにGC handbookを読んで、PythonのGCはにはるかに友好的であるしかし、 Pythonで外部Cコード)

+0

Naive?確かに、innocenr、容易にばかげているように?世俗的な経験がない?ちょっとした評価、ない? – rici

0

「新」の同等ちょうどコンストラクタ例えば使用することです:あなたはCから移植されているので

new_list = list() # or [] - expandable heterogeneous list 
new_dict = dict() # expandable hash table 
new_obj = CustomObject() # assuming CustomObject has been defined 

に注意することがいくつか。 すべてが整数を含むPythonでオブジェクトであり、例えば、ほとんどの変数は単なる参照であるが、このような整数や文字列などのスカラ変数のためのルールは、容器とは異なります。しかし

a = 2 # a is a reference to 2 
b = a # b is a reference to 'a' 
b = 3 # b now points to 3, while 'a' continues to point to 2 

alist = ['eggs', 2, 'juice'] # alist is reference to a new list 
blist = alist # blist is a reference; changing blist affects alist 
blist.append('coffee') # alist and blist both point to 
         # ['eggs', 2, 'juice', 'coffee'] 

あなたが望むのであれば、サイズをあらかじめ割り当てることができますが、多くの場合、あなたはPythonで多くの利点を買わないでしょう。以下は有効です。

new_list4k = [None]*4096 # initialize to list of 4096 None's 
new_list4k = [0]*4096 # initialize to 4096 0's 
big_list = [] 
big_list.extend(new_list4k) # resizes big_list to accomodate at least 4k items 

あなたは物事がスコープの外に行くように、あなたが心配する必要はありませんので、関数内で、例えば、メモリリークが発生しないよう、多くの場合、できるだけローカル変数を使用したい場合。

効率的なベクトル化演算(およびメモリフットプリントの大幅な削減)を行うには、numpy配列を使用します。

import numpy as np 
my_array = np.zeros(8192) # create a fixed array length of 8K elements 
my_array += 4    # fills everything with 4 

私は2セントを追加:私はおそらくあなたの第一の目標が何であるかを尋ねることから始めたい を。プログラム実行のスピードや最小メモリ占有量を最適化しようとする一方で、やり方を変える方法があります。そして、できるだけ短い時間でプログラムを移植しようとする努力があります。時々それらはすべて交差しますが、より頻繁に翻訳するためにはPythonの方法がありますが、より高いメモリ要件が求められます。 Pythonのパフォーマンスを上げるには、おそらく焦点を絞った経験が必要です。 幸運を祈る!

+0

ありがとう、私はそれを考え出した。 –

0

翻訳された言語は、通常、コンパイルされた言語のように型を平坦化しません。メモリレイアウトは、(おそらく)生データとはまったく異なります。したがって、単純に生データをクラスインスタンスにキャストすることはできません。生データを読んで解釈し、オブジェクトを手動で埋めなければなりません。

関連する問題