C言語では、strlenの処理速度はO(n)ですが、PythonではlenのスピードはO(1)になると知りました。この原因は何でしょうか?? なぜこの点処理についてはC言語よりPythonの方が早いのか、ご存じの方はいらっしゃいますでしょうか。

回答1件
あなたの回答
tips
プレビュー
C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。
Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。
C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。
Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。
1グッド
0クリップ
投稿2016/11/15 19:39
C言語では、strlenの処理速度はO(n)ですが、PythonではlenのスピードはO(1)になると知りました。この原因は何でしょうか?? なぜこの点処理についてはC言語よりPythonの方が早いのか、ご存じの方はいらっしゃいますでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
C言語で文字列を扱う場合、ヌル終端文字列という'\0'
を終端の目印にした単純なchar
の配列として表します。この構造は非常に単純です。しかし、長さを調べるには、先頭から一つ一つ'\0'
でないか調べていく必要があります。だからstrlen()
はO(n)の計算量が必要になるのです。
これに対して、Pythonを含めた後々の言語で文字列を表すとき、文字列の長さの情報も一緒に持つようにしました。ある文字列を生成したり、長さが変わるような処理を行った場合は、長さも同時に計算して文字列の実体と一緒に入れておくようにしたと言うことです。なので、長さを求める関数の演算では、その情報を取り出すだけで済むため、len()
等はO(1)で済むことになります。
Cで表現すれば、
C
1struct string { 2 size_t len; 3 char str[0]; 4};
のような構造体で構成されているという感じです(これは一例で、実際はもっと複雑だったり、言語によって異なります)。文字列の操作の時に毎回lenも一緒に計算しておけば、すぐに長さを求める事ができます。逆に言うと、その処理分、単純なヌル終端文字列よりも遅くなってしまう場合があるという欠点もあり、必ずしも有利ではありません。それに、C言語であっても長さを別途自分で計算して別途変数に入れておけば、strlen()
を使わなくてもその場でO(1)で取り出すことができるでしょう。しかし、それはO(n)の処理を前倒しにしているに過ぎません。他の言語は常に前倒しにした方が有利と判断して、文字列に長さの情報も一緒に入れているというわけです。
なお、C言語以外がヌル終端文字列を使わない理由の一つに、'\0'
を扱えないからと言うのがあります。通常のテキストデータで'\0'
が現れる事はありませんが、'\0'
が現れるバイナリデータや特殊なテキストデータ(通信のプロトコルによっては、区切りに'\0'
使う物がある等)を扱おうとすると、ヌル終端文字列では処理がそこで停止してしまいます。'\0'
を終端の目印にせず、別途長さを記憶していれば、'\0'
が現れても処理を継続することができます。
他情報は最初の方にあるリンク先のWikipeidaも参考にしてみてください。
投稿2016/11/15 21:53
総合スコア21784
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/16 11:10